给定这个简单的C代码:

struct {
    struct a {
        int foo;
    };
    struct b {
        char *bar;
    };
} s;

例如,我想知道是否有比s.a.foo = 5更紧凑的方式访问嵌套结构中的变量。

最佳答案

首先,请注意,您的示例不是标准的C89(但是当您要求一些语言扩展时,某些编译器可以接受它)。使用GCC时,需要使用-fms-extensions标记将接受的C dialect扩展到编译器)。您正在使用unnamed fields。一种更标准的编码方式是:

struct a {
   int foo;
};
struct b {
   char* bar;
};
struct {
    struct a aa;
    struct b bb;
} s;

回到你的问题上,不,没有别的办法了。但是,您可以使用预处理器宏,这可能会有所帮助。例如,假设上面的声明,您可以
#define afoo aa.foo
#define bbar bb.bar

然后你可以编码s.afoo而不是s.aa.foo
您还可以定义如下宏
#define AFOO(X) (X).aa.foo

然后编码AFOO(s)
使用这样的预处理器宏确实有些麻烦:在我的示例中,您不能再声明一个名为afoo的变量(或形式参数、字段或函数)
但我不确定你是否该费心。我个人的建议和习惯是给字段赋予更长且通常是唯一的名称(也给我的名称命名)。利用编辑器的自动完成功能。别忘了你的代码读起来比写起来更频繁,所以在代码中使用有意义的名字。

10-01 06:18