Почему это допустимо в C?
Прежде всего, для пояснения, в стандарте C не используется слово legal .
.С точки зрения С, эта программа не строго соответствует :
void foo() { }
int main() { foo(5); } // foo has extraneous arguments
При компиляции этой программы не требуется диагностика из-за вызова функции foo(5)
: нарушения ограничения нет.Но вызов функции foo
с аргументом вызывает неопределенное поведение.Как любая программа, которая вызывает неопределенное поведение, она не является строго соответствующей, и компилятор имеет право отказать в переводе программы.
В стандарте C объявление функции с пустым списком параметров означает, что функция имеетнеопределенное количество параметров.Но определение функции с пустым списком параметров означает, что функция не имеет параметров.
Вот соответствующий параграф в Стандарте C (все выделено мной):
(C99, 6.7.5.3p14) "Список идентификаторов объявляет только идентификаторы параметровфункция. Пустой список в объявителе функции, который является частью определения этой функции указывает, что функция не имеет параметров."
Абзац стандарта C, которыйговорит, что вызов foo(5)
- неопределенное поведение:
(C99, 6.5.2.2p6) " Если выражение, обозначающее вызываемую функцию, имеет тип, который не включаетпрототип , целочисленные преобразования выполняются для каждого аргумента, а аргументы, имеющие тип float, повышаются до двойного значения. Это называется продвижением аргументов по умолчанию. Если число аргументов не равно количеству параметров,поведение не определено . "
А из (C99, 6.9.1p7) мы знаем, что определение foo
не предоставляет прототип.
(C99, 6.9.1p7) "Если декларатор включает в себя список типов параметров, в списке также указываются типы всех параметров;такой декларатор также служит прототипом функции для последующих вызовов той же функции в том же модуле перевода.Если декларатор включает список идентификаторов, типы параметров должны быть объявлены в следующем списке деклараций. "
См. Ответ Комитета на Отчет о дефекте № 317 для получения достоверного ответа по этому вопросу:
http://www.open -std.org / jtc1 / sc22 / wg14 / www / docs / dr_317.htm