Ответ 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" ).