是GCC错误吗?

Is it GCC error?

本文关键字:错误 GCC      更新时间:2023-10-16

当编译我的项目混合CC++时,我得到这个错误(这在编译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修饰符it 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还是我做错了什么?[gcc 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);
}

在ubuntu11.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,你会得到它定义在每个翻译单元,包括(通常间接)这个头。

C99之前的C没有内联关键字。检查你的编译器配置