|
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
酒吧
|
|
AstralHex · 矩阵乘法代码工作不正常 1 年前 |
|
|
Fishie · 作为类成员的智能指针是否仍然自动释放?[关闭] 1 年前 |
|
|
Die4Toast · 递归调用成员箭头运算符-> 1 年前 |
|
|
Anka Hanım · 关于结构和动态数组地址的问题 1 年前 |