c ++包含不同的头文件,在多个源文件中具有相同的类实现

Scy*_*Scy 7 c++ compilation g++ one-definition-rule

例如

class Dummy {
public:
  Dummy() { std::cout << "a.h" << std::endl; }
};
Run Code Online (Sandbox Code Playgroud)

BH

class Dummy {
public:
  Dummy() { std::cout << "b.h" << std::endl; }
};
Run Code Online (Sandbox Code Playgroud)

c.cc

#include "a.h"

void test() {
  Dummy a;
}
Run Code Online (Sandbox Code Playgroud)

d.cc

#include "b.h"

int main() {
  Dummy a;
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

然后使用命令编译源文件

g++ d.cc c.cc
Run Code Online (Sandbox Code Playgroud)

输出是

b.h
Run Code Online (Sandbox Code Playgroud)

但是有了命令

g++ c.cc d.cc
Run Code Online (Sandbox Code Playgroud)

输出是

a.h
Run Code Online (Sandbox Code Playgroud)

我的问题是为什么没有multiple definition错误以及为什么输出取决于编译的顺序?

Sto*_*ica 8

您的程序有未定义的行为.总结一下C++标准,我的重点是[basic.def.odr/6]:

在程序中可以有多个类类型的定义,[...]只要每个定义出现在不同的翻译单元中,并且定义满足以下要求即可.鉴于这样一个名为D的实体在多个翻译单元中定义,那么

  • D的每个定义应由相同的令牌序列组成 ; 和

  • [...]

[...]如果D的定义满足所有这些要求,则行为就好像存在D的单个定义.如果D的定义不满足这些要求,那么行为是不确定的.

所以你观察到两种不同的行为.完全可以接受,因为语言对你应该看到的行为没有任何限制.你违反了合同,所以没有保证.

现在,从实际的角度来看,你看到的只是GCC在上述合同下运作.它假定您不会违反它(即使您这样做),并且只是忽略Dummy对其成员和/或其成员的任何后续重新定义.第一个"胜出".