У меня есть следующий кусок кода, который работает с компилятором 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 и один внешний)
Самый естественный способ — сделать вашу глобальную переменную static
и сделать getCPULimit
Функция не встроена и реализована в файле .cc.
Я почти уверен, что с C-ABI-несовместимой функцией внутри extern "C"
Блок либо не определен, либо запрещен. Тем не менее, ваша функция static
, так что может быть совместимым с C ABI (хотя это выглядит как плохая идея). Возможно, кто-то может привести цитату из стандарта C ++ по этому поводу.
ULONG — это не тип, но если вы не хотите использовать обычный, вы можете typedef
один.
РЕДАКТИРОВАТЬ:
УЛОНГ должен быть УЛОНГОМ.