在C++中,之间有什么区别:
struct Foo { ... };
Run Code Online (Sandbox Code Playgroud)
和
typedef struct { ... } Foo;
Run Code Online (Sandbox Code Playgroud) 引自这里,
在C中,有两种不同的类型名称空间:struct/union/enum标记名称的名称空间和typedef名称的名称空间.
name.c
$ cat name.c
#include<stdio.h>
typedef long long long2;
int long2 () {
return 4;
}
int main() {
printf("hello, world!");
return 0;
}
$ gcc name.c -o name
name.c:4: error: 'long2' redeclared as different kind of symbol
name.c:3: error: previous declaration of 'long2' was here
$
Run Code Online (Sandbox Code Playgroud)
name2.c
$ cat name2.c
#include<stdio.h>
int four() {
return 4;
}
struct dummy {
int member;
};
int main() {
struct dummy four;
}
$ gcc name2.c -o name2 …Run Code Online (Sandbox Code Playgroud) (我说的是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 ×2
c++ ×1
definition ×1
internal ×1
linkage ×1
namespaces ×1
struct ×1
structure ×1
typedef ×1