外部C未解决的符号与gcc 4.8?

时间:2014-03-18 16:05:10

标签: c++ gcc extern gcc4.8

我有以下代码,适用于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和一个外部)是什么意思

2 个答案:

答案 0 :(得分:0)

ULONG不是一种类型,但如果您不想使用普通类型,则可以typedef一种。 编辑: ULONG应该是ulong。

答案 1 :(得分:0)

最自然的方式 - 使您的全局变量static和使getCPULimit函数非内联并在.cc文件中实现。

我几乎可以确定extern "C"块中的C-ABI不兼容函数是未定义的还是禁止的。但是,您的函数是static,因此可能与C ABI兼容(虽然看起来不错)。也许有人可以从C ++标准中引用一个引用。