Неразрешенный символ extern C с gcc 4.8?

У меня есть следующий фрагмент кода, который работает с компилятором gcc 4.3, но когда я скомпилировал с gcc 4.8, устранена ошибка символа (время компоновки)

//test.cc
ULONG CPULimit = 200; 

// тест.ч

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) что значит иметь два экстерна (один экстерн С и один экстерн)


person Wild Widow    schedule 18.03.2014    source источник
comment
Это не ваш реальный код, ULONG не тип   -  person Jonathan Wakely    schedule 18.03.2014
comment
ULONG — это typedef unsigned long в заголовках Windows. Я подозреваю, что вы обновили свой MinGW с gcc 4.3 на gcc 4.8 и получили эту ошибку?   -  person lapk    schedule 18.03.2014
comment
Почему вы используете extern C'ing для статического члена класса? Разве это не прямо противоположно тому, что означает extern C (т. е. убедиться, что компилятор C++ понимает, что ему необходимо применить C ABI к вызову функции к внешнему объекту C).   -  person Klaas van Gend    schedule 19.03.2014


Ответы (2)


Самый естественный способ - сделать вашу глобальную переменную static и сделать функцию getCPULimit не встроенной и реализованной в файле .cc.

Я почти уверен, что C-ABI-несовместимая функция в блоке extern "C" либо не определена, либо запрещена. Однако ваша функция static, поэтому она может быть совместима с C ABI (хотя это выглядит плохой идеей). Возможно, кто-то может привести цитату из стандарта С++ по этому поводу.

person keltar    schedule 18.03.2014

ULONG — это не тип, но если вы не хотите использовать обычный тип, вы можете typedef использовать его. РЕДАКТИРОВАТЬ: ULONG должен быть ulong.

person Bfitzy    schedule 18.03.2014