Подтвердить что ты не робот

Void, VOID, C и С++

У меня есть следующий код:

typedef void VOID;
int f(void);
int g(VOID);

который отлично компилируется в C (с использованием gcc 4.3.2 на Fedora 10). Тот же код, скомпилированный как С++, дает мне следующую ошибку:

void.c:3: error: ‘<anonymous>’ has incomplete type
void.c:3: error: invalid use of ‘VOID’

Теперь это что-то во внешней библиотеке, и я бы хотел, чтобы владелец исправил эту проблему. Поэтому у меня есть вопрос - запрещает ли С++ стандарт этой конструкции? Не могли бы вы дать мне указатель/цитату? Единственное, что я могу вспомнить, это то, что объявление функции с (void), чтобы сигнализировать пустой список параметров, устарело в С++, но я не понимаю, почему typedefed VOID не работает.

4b9b3361

Ответ 1

Да, насколько я знаю, второе объявление недействительно в С++ и C89, но оно действительно на C99.

Из черновика C99, TC2 (6.7.5.3/10):

Частный случай неименованного параметра типа void как единственный элемент в списке указывает, что функция не имеет параметров.

Он явно говорит о типе "void", а не о ключевом слове.

Из стандарта С++, 8.3.5/2:

Если предложение parameter-declaration пустое, функция не принимает аргументов. Список параметров (void) эквивалентен списку пустых параметров.

Это означает, что фактическое ключевое слово с "void", а не общий тип "void" также можно увидеть из одного из случаев, когда сбой аргумента шаблона (14.8.2/2):

  • Попытка создать тип функции, в которой параметр имеет тип void.

Об этом говорят другие, заметные в одном отчете о проблеме с основным ядром здесь и некоторые реплики GCC, связанные с другими ответами.


Напомним, что ваш GCC прав, но предыдущие версии GCC были неправильными. Таким образом, этот код мог быть успешно скомпилирован ранее. Вы должны исправить свой код, чтобы он использовал "void" для обеих функций, затем он будет компилироваться также и с другими компиляторами (callau также отклоняет второе объявление с помощью этого "VOID" ).

Ответ 2

gcc bugs. Изменить: поскольку это было недостаточно ясно, я имел в виду, что gcc 4.3.2 скомпилировал его из-за ошибок. См. # 32364 и # 9278.

Ответ 3

Я просто поместил ваш код в файл .cpp и скомпилирован без проблем в VS2005, SUSE, Redhat и Solaris, поэтому, я думаю, ваша конкретная версия gcc не одобряет это. Gal