【发布时间】:2014-04-24 10:50:33
【问题描述】:
我有以下代码,它适用于 gcc 4.3 编译器,但是当我使用 gcc 4.8 编译时,得到解决的符号错误(链接时间)
//test.cc
ULONG CPULimit = 200;
// 测试.h
namespace ABC
{
class STAT
{
public:
static ULONG getCPULimit();
}
}
在同一个 test.h 文件本身中,我已经内联定义了 getCPULimit() 函数
inline ULONG
ABC::STAT::getCPULimit()
{
extern ULONG CPULimit;
return CPULimit;
}
以上代码在 4.3 编译器下工作,4.8 出现未解决的符号错误。
将 extern ULONG CPULimit 移到函数之外,会起作用,但它会暴露全局变量。 现在我像这样用 extern "C" 包装了函数
extern "C"
{
inline ULONG
ABC::STAT::getCPULimit()
{
extern ULONG CPULimit;
return CPULimit;
}
}
令人惊讶的是,它奏效了, 1)我不确定它是如何工作的,有人能解释一下吗?这是正确的做法吗?
2) 有两个 extern 是什么意思(一个 extern C 和一个 extern)
【问题讨论】:
-
这不是您的实际代码,
ULONG不是类型 -
ULONG是 Windows 标头中的typedef unsigned long。我怀疑,您已将MinGW从gcc 4.3更新为gcc 4.8并收到此错误? -
你为什么要extern "C"'ing一个类的静态成员?这与 extern "C" 的含义不完全相反(即确保 C++ 编译器理解它需要将 C ABI 应用于对外部 C 对象的函数调用)。