考虑以下示例。它由两个头文件组成,声明了两个不同的命名空间:
// a1.h
#pragma once
#include "a2.h"
namespace a1
{
const int x = 10;
typedef a2::C B;
}
第二个是
// a2.h
#pragma once
#include "a1.h"
namespace a2 {
class C {
public:
int say() {
return a1::x;
}
};
}
和一个单一的源文件,main.cpp
:
#include <iostream>
#include "a1.h"
#include "a2.h"
int main()
{
a2::C c;
std::cout << c.say() << std::endl;
}
这样它就不会编译(尝试过 GCC 和 MSVC)。错误是a1
未声明命名空间(Windows 上的 C2653)。如果您以main.cpp
这种方式更改包含顺序:
#include "a2.h"
#include "a1.h"
您会收到一条对称错误消息,即a2
未声明命名空间。
有什么问题?