extern C неразрешенный символ с gcc 4.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 за пределы функции будет работать, но оно предоставляет глобальную переменную.
теперь я обернул функцию с внешним «C», как это

extern "C"{
inline ULONG
ABC::STAT::getCPULimit()
{
extern ULONG CPULimit;
return CPULimit;
}
}

и на удивление это сработало,
1) Я не уверен, как это работает, кто-нибудь может пролить свет? Это правильный способ сделать это?

2) что означает иметь два внешних объекта (один внешний C и один внешний)

0

Решение

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

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

0

Другие решения

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

0

По вопросам рекламы [email protected]