![]() |
1
24
定义用于创建对象的模板。它不创建任何对象或函数。除非
请注意,C和C++如何处理不兼容是有区别的。
然而,它在C++中是不合法的。在C++中,它们具有外部链接,必须定义相同。见 3.2 One definition rule/5 更多详情。 |
![]() |
2
18
这种情况下的区别概念称为 联动装置 . 在C结构中,union或enum标记具有 无联动装置 . 它们实际上在其范围内是本地的。
不能在同一范围内重新声明它们(除非如此调用
提前声明
)但它们可以在不同的范围内自由地重新声明,包括不同的翻译单元。在不同的范围中,它们可以声明完全独立的类型。这就是您在示例中所拥有的:在两个不同的翻译单元中(即在两个不同的文件范围中),您声明了两个不同且不相关的
同时,函数在C中有链接。在您的示例中,这两个定义定义了相同的函数。
C++中的概念
联动装置
扩展:它将特定的链接分配给更广泛的实体,包括类型。在C++类中有链接类型。命名空间范围中声明的类具有
外联动装置
. C++的一个定义规则明确指出,如果一个具有外部链接的类具有多个定义(跨不同的翻译单位),则应该在所有这些翻译单元中等价地定义。
http://eel.is/c++draft/basic.def.odr#12
)所以,在C++中
您的函数定义在C++中仍然是非法的,因为C++规则(但基本上与C中的原因相同)。 |
![]() |
3
12
函数定义都声明一个名为
如果使用相同的名称声明具有外部链接的对象,则这将是一个错误: Fo.C
酒吧
现在有两个对象被调用
即使其中一个对象只是声明的,而不是定义的,这仍然是错误的: Fo.C
酒吧
这是未定义的,因为
C++有类似但更复杂的规则来解释。
|
![]() |
4
3
两份声明
例如,如果您这样做:
酒吧:
你会调用
undefined behavior
因为
结构的兼容性详见 C standard :
总之,这两个例子
需要这样的规则,以便
|
![]() |
5
2
不同的是名称和存在的不同;结构定义不存储在任何地方,它的名称只在编译期间存在。
另一方面,函数需要存储在某个地方,如果它有外部链接,则链接器需要它的名称。
如果你发挥你的作用
|
![]() |
6
2
要从链接器中隐藏函数定义,请使用关键字static。 Fo.C
酒吧
|
![]() |
ravi chandra · 为什么这不违反一条定义规则? 7 年前 |
![]() |
daya · 无法理解全局变量和具有外部存储类的变量之间的区别? 8 年前 |
![]() |
mahdiolfat · 为什么“函数的隐式声明”只是一个警告? 9 年前 |
![]() |
Benoît Dubreuil · gtest和MinGW链接 9 年前 |
|
user5117637 · C++如何区分调用全局变量和声明全局变量? 10 年前 |
![]() |
Neil · 具有C++命名空间的文件范围数据 10 年前 |