void, VOID, C и C ++ - PullRequest
       31

void, VOID, C и C ++

12 голосов
/ 12 февраля 2009

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

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

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

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

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

Ответы [ 3 ]

18 голосов
/ 12 февраля 2009

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

17 голосов
/ 12 февраля 2009

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

Из чертежа C99, TC2 (6.7.5.3/10):

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

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

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

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

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

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

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


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

0 голосов
/ 12 февраля 2009

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

...