Это ошибка GCC? - PullRequest
       22

Это ошибка GCC?

4 голосов
/ 12 декабря 2011

При компиляции моего проекта, смешивая 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 и удалите модификатор inline перед __convert_from_v 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. Это ошибка или я что-то не так делаю ??? [gcc 4.6.1, Ubuntu 11.10]

Ответы [ 2 ]

7 голосов
/ 13 декабря 2011

Вероятно, из-за настроек оптимизации или переопределения 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);
}

Компиляция с g ++ 4.6.1 в Ubuntu 11.10 выдает ошибку:

/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 вы получите его в каждой единице перевода, которая включает (обычно косвенно) этот заголовок.

0 голосов
/ 13 декабря 2011

C до C99 не имеет ключевого слова inline .Проверьте конфигурацию вашего компилятора.

...