为什么匿名结构(非typedef'd)在c中有用?

Jul*_*ian 3 c struct

每当我输入时我都意识到了

typedef struct {
//  ...
} foo;
Run Code Online (Sandbox Code Playgroud)

有一个匿名结构正在被typedef.我想不出有任何方法可以将匿名结构传递给函数,所以它似乎没用.
我能想到的唯一用途是像这样的c ++:

struct {
    char* name;
    int   age;
} alice;

void print_info(auto v) {
    printf("name: %s age: %i", v.name, v.age);
}

int main() {
    alice.name = "Alice";
    alice.age  = 24;
    print_info(alice);
}
Run Code Online (Sandbox Code Playgroud)

尽管c缺少任何类似的内置多态性,但它也允许匿名结构.

任何人都可以找到有用的情况吗?

Jon*_*ler 6

这种un-typedef的匿名结构的用途非常有限,但用途并不是很少.基本上,它们允许您将一些数据组合在一个函数或单个源文件中.

其中一个缺点是在文件范围定义的任何此类变量应该是static因为没有适当的声明可用于其他文件.在单个函数内部,变量可以是自动的或static根据需要; 我想如果你有,struct { … } *peculiar;那么你甚至可以管理动态分配.但是,如果你喜欢玩火和双重维护的噩梦,你实际上可以在其他源文件中引用原始变量 - 你不应该这样做!所以,有可能(但请不要这样做!):

但是,如果需要源文件之间共享的信息,请创建标题并为结构类型指定名称(通过标记或typedef或两者).

(为什么这个工作呢?想想预处理后的编译器看到的是什么?它把每个TU等价信息,并会得到它的权利,如果定义/声明的比赛,但它是很容易保证,当你有一个头它们匹配提供他们.)

假设你没有沉迷于这种可疑的做法,那么你是正确的,没有办法传递这些变量.因此,您可能会使用具有文件范围的结构化变量,但内部链接可以由源文件中的多个函数访问.这些设计远非闻所未闻,尽管它们往往有点可疑.

请注意,如果您有:

static struct {
    char* name;
    int   age;
} alice;

static struct {
    char* name;
    int   age;
} bob;
Run Code Online (Sandbox Code Playgroud)

然后alicebob具有不同类型的(所以你不能写bob = alice;alice = bob;).

因此,总的来说,这些变量的使用有限,但不是零使用.使用这些变量很少是一个好主意,但如果有充分的理由(经得起仔细的批判性审查,最好是由几个人进行),那么你可以继续使用它们.但是你需要确定结构标签的成本是不可接受的.(我至少会添加结构标记,如果只是为了更好地记录它代表什么.)