一个定义规则和两个翻译单元中的不同类定义

时间:2013-05-02 17:53:06

标签: c++

有这段代码:

档案a.hpp:

class A;

档案a.cpp:

#include "a.hpp"

struct A {
   int x = 777;
   int y;
};

A a_zew;

文件main.cpp:

#include "a.hpp"
#include <iostream>

class A { // definition of class A is different than above
public:
   int x;
};

int main() {
   A a; // definition of class A in main.cpp
   extern A a_zew; // definition of class A in a.cpp
   std::cout << a_zew.x << std::endl; // 777
   std::cout << a.x << std::endl; // junk
   return 0;
}

因此,在文件 main.cpp a.cpp 中定义了类A,并且每个翻译单元中还定义了这两个类的两个对象。类A的两个翻译单元中的定义不同,但此代码编译。但是,一个定义规则表明程序中可以有许多类型的定义(但每个翻译单元中只有一个),这些定义应该相同。那么,即使两个文件中类A的定义不同,为什么这个代码会编译?

1 个答案:

答案 0 :(得分:8)

您的程序有未定义的行为。 C ++ 11标准的Paragaph 3.2 / 6指定:

  

在一个程序中可以有多个类类型的定义(第9条),[...]提供每个定义   出现在不同的翻译单元中,并且定义满足以下要求。特定   这样一个名为D的实体在多个翻译单元中定义,然后[...]

以下是您的计划确实违反的要求列表。但是,在列表的末尾,提到了这一点:

  

[......]如果D的定义满足所有这些要求,   然后程序的行为应该像D的单一定义一样。 如果D的定义不满足   这些要求,然后行为未定义

相关问题