SHH*_*SHH 4 c structure definition internal linkage
(我说的是C,但它也适用于C++中的类模板)
在头文件中,习惯上放置所有声明,而不是定义。然而,我们通常也会将结构定义或类模板放入头文件中,但实际上并不知道为什么可以。这实际上没有意义,因为它们也是定义——一个定义规则。(是的,结构定义和类模板不会导致任何存储设置,但您仍然会收到下面的“重新定义”错误,这意味着它们是定义)。
EX)在同一文件中定义具有相同标记的多个结构会导致重新定义错误,但在多个源文件中定义具有相同标记的多个结构不会导致任何错误(类也会发生同样的情况)。
唯一有意义的是结构定义和类模板具有内部链接(与默认的外部链接相反),但我在 K&R 或参考手册中找不到任何关于它的参考。事实上,链接中甚至没有提到结构。
我想知道 ANSI 标准指出这种现象的确切参考文献。(IMO,这是一个相当模糊的事情,必须在 ANSI 标准中的某个地方提到)。
编辑 我不是问为什么结构定义可以放入头文件中。
我问为什么将结构定义放在头文件中不会像我们将变量定义放在头文件中(并将其包含在多个源文件中)那样导致重新定义错误
EX) test1.c: int a = 3; test2.c: int a = 4; 由于重新定义导致编译错误。然而,
test1.c: 结构测试 { int a }; test2.c: 结构测试 { int b }; 不会导致编译错误,我能想到的唯一原因是结构定义要么具有内部链接,要么根本没有链接。
在 C 中,只有对象和函数具有链接。由于struct在 C 中可能不包含函数或“ static”成员对象,就像在 C++ 中一样,您的问题在这里没有多大意义。
C++ 中的成员函数只要未定义而仅在内部声明就struct没有问题。如果它们也被定义,那么它们就是inline。C++ 刚刚发明的概念就是inline为了捕捉这种情况:可以通过头文件在多个编译单元中共享的函数定义。C99 采用了这个概念(稍作修改)。
static成员对象确实带来了更多的问题。如何实例化这些家伙的语法相当晦涩,尤其是对于template classes 或structs。如果您想了解这一点,您必须询问它,并专门用 C++ 标记。