每当我输入时我都意识到了
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缺少任何类似的内置多态性,但它也允许匿名结构.
任何人都可以找到有用的情况吗?
这种un-typedef的匿名结构的用途非常有限,但用途并不是很少.基本上,它们允许您将一些数据组合在一个函数或单个源文件中.
其中一个缺点是在文件范围定义的任何此类变量应该是static因为没有适当的声明可用于其他文件.在单个函数内部,变量可以是自动的或static根据需要; 我想如果你有,struct { … } *peculiar;那么你甚至可以管理动态分配.但是,如果你喜欢玩火和双重维护的噩梦,你实际上可以在其他源文件中引用原始变量 - 你不应该这样做!所以,有可能(但请不要这样做!):
file1.c
struct { char* name; int age; } alice;
Run Code Online (Sandbox Code Playgroud)file2.c
extern struct { char* name; int age; } alice;
Run Code Online (Sandbox Code Playgroud)但是,如果需要源文件之间共享的信息,请创建标题并为结构类型指定名称(通过标记或typedef或两者).
(为什么这个工作呢?想想预处理后的编译器看到的是什么?它把每个TU等价信息,并会得到它的权利,如果定义/声明的比赛,但它是很容易保证,当你有一个头它们匹配提供他们.)
假设你没有沉迷于这种可疑的做法,那么你是正确的,没有办法传递这些变量.因此,您可能会使用具有文件范围的结构化变量,但内部链接可以由源文件中的多个函数访问.这些设计远非闻所未闻,尽管它们往往有点可疑.
请注意,如果您有:
static struct {
char* name;
int age;
} alice;
static struct {
char* name;
int age;
} bob;
Run Code Online (Sandbox Code Playgroud)
然后alice和bob具有不同类型的(所以你不能写bob = alice;或alice = bob;).
因此,总的来说,这些变量的使用有限,但不是零使用.使用这些变量很少是一个好主意,但如果有充分的理由(经得起仔细的批判性审查,最好是由几个人进行),那么你可以继续使用它们.但是你需要确定结构标签的成本是不可接受的.(我至少会添加结构标记,如果只是为了更好地记录它代表什么.)