你能在不同的翻译单元中有两个同名和同一个成员函数的类吗?

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 的所有定义,应满足以下要求。

  • ...
  • 每个这样的定义应由相同的标记序列组成,其中闭包类型的定义是......
  • ...

在这种情况下必须使用匿名命名空间吗?

如果您需要不同的类定义,它们必须是不同的类型。唯一命名的命名空间是一种选择,匿名命名空间是获得唯一(对于翻译单元)命名空间的保证方式。