考虑下面的例子。它由两个头文件,声明了两个不同的命名空间:C++命名空间:交叉使用
// 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
命名空间不宣。
有什么问题?
的#pragma一次不是C++,它是微软的事情。最好换成#ifdef A1_H #define A1_H ... #endif // A1_H – MSalters 2008-12-19 12:05:02