gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 18:26:09 26 4
gpt4 key购买 nike

例如

啊.h

class Dummy {
public:
Dummy() { std::cout << "a.h" << std::endl; }
};

b.h

class Dummy {
public:
Dummy() { std::cout << "b.h" << std::endl; }
};

抄送

#include "a.h"

void test() {
Dummy a;
}

d.cc

#include "b.h"

int main() {
Dummy a;
return 0;
}

然后用命令编译源文件

g++ d.cc c.cc

输出是

b.h

但是有命令

g++ c.cc d.cc

输出是

a.h

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

最佳答案

您的程序有未定义的行为。总结 C++ 标准的做法,这里是 [basic.def.odr/6]我强调:

There can be more than one definition of a class type, [...] in a program provided that each definition appears in a different translation unit, and provided the definitions satisfy the following requirements. Given such an entity named D defined in more than one translation unit, then

  • each definition of D shall consist of the same sequence of tokens; and

  • [...]

[...] If the definitions of D satisfy all these requirements, then the behavior is as if there were a single definition of D. If the definitions of D do not satisfy these requirements, then the behavior is undefined.

因此您观察到两种不同的行为。完全可以接受,因为语言对您应该看到的行为没有任何限制。你违反了契约(Contract),所以没有任何保证。

现在,从实际的角度来看,您所看到的只是 GCC 在上述契约(Contract)下运行。它假设您不会违反它(即使您违反了),并且只是忽略 Dummy 和/或其成员的任何后续重新定义。第一个“胜出”。

关于c++在多个源文件中包含具有相同类实现的不同头文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47968039/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com