C:如何访问不同类型的匿名或未命名的嵌套结构

Pie*_*erV 5 c struct anonymous-struct

我注意到有几种方法可以在C中的其他结构中定义结构:

struct s {
    int abc;

    struct {
        int a;
    };

    struct {
        int b;
    } intern;

    struct i {
        int c;
    };

    struct i2 {
        int d;
    } intern2;

    struct i3 {
        int e;
    };
    struct i3 intern3;
};
Run Code Online (Sandbox Code Playgroud)

这个结构使用gcc或g ++编译很好,所以我假设所有参数都可以通过某种方式访问​​.我试过这样的:

int main(int argc, char const *argv[])
{
    struct s mystruct;

    mystruct.abc = 0;
    mystruct.a = 1;
    mystruct.intern.b = 2;
    mystruct.c = 3; // <-- does not compile
    mystruct.intern2.d = 4;
    mystruct.intern3.e = 5;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

除了访问mystruct.c,一切都编译(编译错误消息是‘struct s’ has no member named ‘c’).我是否以正确的方式访问struct参数?还有替代品吗?我如何访问c参数?

Sou*_*osh 5

在你的代码中,

\n\n
struct i {\n        int c;\n    };\n
Run Code Online (Sandbox Code Playgroud)\n\n

没有类型的成员变量,struct i也不符合匿名结构 Note 的条件。如果您创建该类型的变量,您将能够访问成员变量c,类似于您对变量所做的struct i3操作intern3

\n\n

添加一些关于您看到的错误消息的内容,

\n\n
\n

struct s没有指定成员c

\n
\n\n

因为,在匿名结构的情况下,成员被视为包含结构的直接成员。如果struct定义带有tag,则该结构不是匿名结构,并且该结构的成员需要访问该类型的结构变量。

\n\n
\n\n

笔记:

\n\n

关于匿名结构,引用C11,章节 \xc2\xa76.7.2.1,(重点是我的

\n\n
\n

其类型说明符是不带标记的结构说明符的未命名成员称为\n 匿名结构;类型说明符是没有标记的联合说明符的未命名成员称为匿名联合。匿名结构或联合的成员被视为包含结构或联合的成员。如果包含的结构或联合也是匿名的,则这会递归地应用。

\n
\n