考慮下面的例子。它由兩個頭文件,聲明瞭兩個不同的命名空間: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