访问C中的工会会员

时间:2019-11-19 13:08:04

标签: c struct enums

我对C有点陌生,我正在尝试访问结构内部的并集内部结构的某些成员。我尝试过类似struct.struct.member的操作,但是失败了,我也尝试使用箭头运算符(用'->'代替'。')来访问它,但是效果不佳。 因此,以我为例,我试图访问“ tree_node”结构内部的“程序”。这是该结构的代码:

struct tree_node;
typedef struct tree_node node_t;

struct tree_node
{
    enum node_type type;

    union {
        struct {
            char *program;
            char **argv;
            size_t argc;
        } command;

        struct {
            node_t **parts; // array
            size_t n_parts;
        } pipe;

        struct {
            node_t *child;
            int fd; // >= 0 specific fd; -1 stdout+stderr
            enum redirect_type mode;
            union {
                int fd2;
                char *target;
            };
        } redirect;

        struct {
            node_t *child;
        } subshell;

        struct {
            node_t *child;
        } detach;

        struct {
            node_t *first;
            node_t *second;
        } sequence;
    };
};

我当前用来访问“程序”的代码(没有单词)是这样的:

node_t *n

if (n.command.program == "cd")
        {
            printf("cd command entered\n");
        }

知道我要去哪里错了吗? 干杯:)

1 个答案:

答案 0 :(得分:2)

这里有一个示例,说明如何通过对象或指针访问那些结构/联合。看最后一个例子。它显示了如何使用匿名结构/联合-它们只需要具有明确的字段名称

void foo()
{
    node_t obj, *ptr;

    ptr -> pipe.n_parts = 5;
    printf("%s\n", ptr -> command.program);

    obj.detach.child = ptr;
    obj.bar = obj.foo;
}

数据结构在这里

struct tree_node;
typedef struct tree_node node_t;

struct tree_node
{
    int type;

    union {
        struct {
            char *program;
            char **argv;
            size_t argc;
        } command;

        struct {
            node_t **parts; // array
            size_t n_parts;
        } pipe;

        struct {
            node_t *child;
            int fd; // >= 0 specific fd; -1 stdout+stderr
            int mode;
            union {
                int fd2;
                char *target;
            };
        } redirect;

        struct {
            node_t *child;
        } subshell;

        struct {
            node_t *child;
        } detach;

        struct {
            node_t *first;
            node_t *second;
        } sequence;

        struct {
            node_t *bar;
            node_t *foo;
        };

    };
};