当编译我的项目混合 C
和 C++
时我得到这个错误(编译 C++ 文件时):
/usr/include/c++/4.6/x86_64-linux-gnu/./bits/c++locale.h:
In function ‘int std::__convert_from_v(__locale_struct* const&, char*, int, const char*, ...)’:
/usr/include/c++/4.6/x86_64-linux-gnu/./bits/c++locale.h:70:3:
sorry, unimplemented:
function ‘int std::__convert_from_v(__locale_struct* const&, char*, int, const char*, ...)’
can never be inlined because it uses variable argument lists
编译结束。
但是当我手动编辑文件时
/usr/include/c++/4.6/x86_64-linux-gnu/./bits/c++locale.h
并删除 __convert_from_v
之前的 inline
修饰符 WORKS。
导致问题的函数头最初是 inline
:
inline int
__convert_from_v(const __c_locale& __cloc __attribute__ ((__unused__)),
char* __out,
const int __size __attribute__ ((__unused__)),
const char* __fmt, ...)
我想像这样的函数不应该被标记为inline
。是bug还是我做错了什么??? [海湾合作委员会 4.6.1,Ubuntu 11.10]
最佳答案
这可能是由于优化设置或 inline
的重新定义导致 __convert_from_v
被内联。这是一个重现错误的小人工示例:
#define inline __always_inline
#include <bits/c++locale.h>
int main () {
__locale_t loc;
return std::__convert_from_v(loc, 0, 0, 0);
}
在 Ubuntu 11.10 上使用 g++ 4.6.1 编译出现错误:
/usr/include/c++/4.6/x86_64-linux-gnu/./bits/c++locale.h: In function ‘int std::__convert_from_v(__locale_struct* const&, char*, int, const char*, ...)’:
/usr/include/c++/4.6/x86_64-linux-gnu/./bits/c++locale.h:70:3: sorry, unimplemented: function ‘int std::__convert_from_v(__locale_struct* const&, char*, int, const char*, ...)’ can never be inlined because it uses variable argument lists
因此请检查您的代码以重新定义 inline
或尝试不同的优化设置。
我认为这个函数被标记为 inline
的原因是因为它是在头文件中定义的。如果没有 inline
,您将在包含(通常是间接地)此 header 的每个翻译单元中定义它。
关于c++ - 是 GCC 错误吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8479950/