Arm*_*yan 14 c++ linker class linkage
假设我有两个翻译单元:
//A.cpp
class X
{
};
//B.cpp
class X
{
int i;
};
Run Code Online (Sandbox Code Playgroud)
上面的程序是否格式良好?
如果没有,没有进一步的问题。如果答案是肯定的,程序是良构的(忽略 main 的缺失),那么第二个问题。如果其中有一个同名的函数怎么办?
//A.cpp
class X
{
void f(){}
};
//B.cpp
class X
{
int i;
void f(){}
};
Run Code Online (Sandbox Code Playgroud)
这对链接器来说会不会是一个问题,因为它会在两个目标文件中看到 &X::f ?在这种情况下必须使用匿名命名空间吗?
eer*_*ika 17
上面的程序是否格式良好?
不,它违反了单一定义规则:
[基本.def.odr]
可以有多个定义
- 班级类型([班级]),
- ...
在程序中,前提是每个定义出现在不同的翻译单元中,并且定义满足以下要求。给定在多个翻译单元中定义的实体 D,对于 D 的所有定义,或者,如果 D 是未命名的枚举,对于在任何给定程序点可到达的 D 的所有定义,应满足以下要求。
- ...
- 每个这样的定义应由相同的标记序列组成,其中闭包类型的定义是......
- ...
在这种情况下必须使用匿名命名空间吗?
如果您需要不同的类定义,它们必须是不同的类型。唯一命名的命名空间是一种选择,匿名命名空间是获得唯一(对于翻译单元)命名空间的保证方式。