【发布时间】:2014-11-30 13:26:36
【问题描述】:
如果我有一个带有一些声明的标题:
“头文件.hpp”
extern int SomeData;
int SomeFunc();
以及它的一个实现(我在一个未命名的命名空间中声明了所有函数和全局变量,以避免链接问题):
“头文件.cpp”
#include "Header.hpp"
inline namespace
{
const int SomeLocalFileData = 9;
struct MyLocalStructure;
int SomeLocalFunction(MyLocalStructure *);
int ::SomeData(SomeLocalFileData);
int ::SomeFunc()
{
return SomeLocalFunction(nullptr);
}
}
上述代码将失败并出现以下错误(使用 'gcc' 编译器):
错误:“SomeData”的声明不在“::”周围的命名空间中 int ::SomeData(SomeLocalFileData);
错误:'int SomeFunc()' 的声明不在周围的命名空间中 '::' int ::SomeFunc()
所以无论如何我可以将所有本地文件符号声明在匿名命名空间中,以避免链接问题,但同时能够定义我的函数和数据导出。
【问题讨论】:
-
您是否尝试在外部符号
SomeData和SomeFunc之前结束匿名命名空间?在同一个翻译单元中,他们应该可以访问您在匿名命名空间中的本地定义。 -
所以我无法在另一个命名空间中定义我的全局函数?
-
函数应该在声明它们的命名空间中定义。但是,您可以在全局命名空间中定义全局函数,这些函数使用在匿名命名空间中定义的局部符号(参见我的回答如下)。
标签: c++ c++11 gcc namespaces