va_list не был объявлен

При компиляции некоторого рабочего кода Fedora 11 я получаю эту ошибку:

/usr/include/c++/4.4.1/cstdarg:56: error: ‘::va_list’ has not been declared

Я использую:

[doriad@davedesktop VTK]$ g++ --version
g++ (GCC) 4.4.1 20090725 (Red Hat 4.4.1-2)

Кто-либо знает, какова проблема могла быть?

15
задан Keith Pinson 31 December 2012 в 21:03
поделиться

1 ответ

Ввод варадического набора макросов в g++ 4.4 имеет запутанную и извращенную семантику. Вы можете получить лучшее представление о том, что не происходит, используя g++ -E broken_code.cpp и посмотрев, что вводит препроцессор. Есть несколько десятков директив препроцессора GNU C, которые могут помешать объявлению ::va_list компилироваться как __gnuc_va_list, которое само имеет тип __builtin_va_list

Нежелательный код:

$cat junk.cpp
#include <cstdarg>

void foo(char *f, ...) { va_list va; va_start(va, va); }
int main(void) { foo("", "", ""); return 0; }
$ g++ junk.cpp
$ g++ --version
g++ (Ubuntu 4.4.1-4ubuntu9) 4.4.1

компилируется и связывается (с предупреждениями) с соответствующим результатом g++ -E junk. cpp being:

# 40 "/usr/lib/gcc/i486-linux-gnu/4.4.1/include/stdarg.h" 3 4
typedef __builtin_va_list __gnuc_va_list;
# 102 "/usr/lib/gcc/i486-linux-gnu/4.4.1/include/stdarg.h" 3 4
typedef __gnuc_va_list va_list;
# 45 "/usr/include/c++/4.4/cstdarg" 2 3
# 54 "/usr/include/c++/4.4/cstdarg" 3
namespace std __attribute__ ((__visibility__ ("default"))) {

  using ::va_list;

}
3
ответ дан 1 December 2019 в 01:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: