我有以下代码,适用于gcc 4.3编译器,但是当我用gcc 4.8编译时,得到了解析符号错误(链接时间)
//test.cc
ULONG CPULimit = 200;
// test.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)有两个外部(一个外部C和一个外部)是什么意思
答案 0 :(得分:0)
ULONG不是一种类型,但如果您不想使用普通类型,则可以typedef
一种。
编辑:
ULONG应该是ulong。
答案 1 :(得分:0)
最自然的方式 - 使您的全局变量static
和使getCPULimit
函数非内联并在.cc文件中实现。
我几乎可以确定extern "C"
块中的C-ABI不兼容函数是未定义的还是禁止的。但是,您的函数是static
,因此可能与C ABI兼容(虽然看起来不错)。也许有人可以从C ++标准中引用一个引用。