4

有这个代码:

文件 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;
}

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

4

1 回答 1

8

您的程序具有未定义的行为。C++11 标准的第 3.2/6 段规定:

如果每个定义出现在不同的翻译单元中,并且定义满足以下要求,则程序中可以有多个类类型的定义(第 9 条),[...]。给定这样一个D在多个翻译单元中定义的实体,那么 [...]

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

[...] 如果 的定义D满足所有这些要求,那么程序的行为就好像有一个D. 如果 的定义D不满足这些要求,则行为未定义

于 2013-05-02T17:58:10.313 回答