【发布时间】:2010-09-27 14:11:15
【问题描述】:
考虑以下示例。它由两个头文件组成,声明了两个不同的命名空间:
// 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 once 不是 C++,它是微软的东西。最好替换为 #ifdef A1_H #define A1_H ... #endif // A1_H
标签: c++ namespaces include