Да, насколько я знаю, второе объявление недопустимо в 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»).