我最近意识到,虽然在给定的翻译单元中多次定义某些东西是非法的,但随意多次声明事物(函数、变量、结构)是完全合法的。我的印象是包含守卫的目的是防止重复声明。
事实上,它们的目的似乎是为了防止重复定义。然而,由于函数和变量定义正确地属于 .c 文件而不是 .h 文件,并且只有 .h 文件是# include'd,这似乎意味着只有结构和联合存在问题(因为我们通常在 . h 文件,而不仅仅是声明它们)。(甚至维基百科页面上的示例包含警卫使用结构定义)。
我的问题是:为什么在头文件中定义结构如此普遍?难道我们不能在头文件中声明它们,然后将它们的定义放在 .c 文件中,然后完全不需要包含警卫,因为重复声明是可以的?
如果我不得不猜测,那是因为如果我们这样做了,那么包含此类头文件的源文件唯一能够这样做的就是创建指向结构的指针,因为它们包含的字段的定义在其他一些 .c 文件中. 那准确吗?