В C, если функция определена с помощью 0 аргументов (пустой список параметров) вызывается с любым количеством аргументов, gcc не дает никаких ошибок. Почему это так?Почему функции с аргументами без аргументов вызываются с любым количеством аргументов?
ответ
Потому что это то, как функции C определяют функцию.
Если вы хотите, чтобы функция не принимала никаких аргументов, явно укажите void
в списке аргументов.
Если вы хотите, чтобы функция принимает переменное количество аргументов, используйте переменные аргументы ...
. Или в древнем C вы можете оставить список аргументов пустым, и компилятор будет применять поощрение по умолчанию к каждому аргументу.
Хотя последний устаревшее в настоящее время: из раздела 6.11.6 Функция declarators C11 SPEC n1570 Проект
The use of function declarators with empty parentheses (not prototype-format parameter type declarators) is an obsolescent feature.
TL; DR - int func(void) {..
и int func() {..
не то же самое.
В первом случае, явным образом не упоминать
void
как тип параметра (не идентификатор требуемого) примечание функция определяется как таковой нет входного параметра, так что при вызове он не должен пройти любой аргумент.В более позднем случае проверки количества переданных аргументов не производится, поэтому вы разрешили передавать любое количество и тип аргументов.
Примечание:
Согласно C11
, глава §6.9.1
If the declarator includes a parameter type list, the declaration of each parameter shall include an identifier, except for the special case of a parameter list consisting of a single parameter of type
void
, in which case there shall not be an identifier. No declaration list shall follow.
Рассмотрим этот кусок кода:
//void Test(int a);
int main()
{
int a = 0;
Test();
return 0;
}
Он будет компилироваться (в основном с предупреждением в зависимости от компилятора, настроек и т. Д.), Потому что компилятор предполагает, что Test
является функцией, принимающей любое количество аргументов и возвращающим int
. Это также называется «неявной декларацией». Вы никогда не должны использовать эту устаревшую функцию языка C.
Если вы раскомментировать первую строку void Test(int a);
, она не будет собирать больше, потому что теперь компилятор знает, что Test
функция возвращающая int
и принимать ровно один аргумент int
и как мы называем Test()
без аргументов, компилятор может бросить ошибка, потому что аргументы при вызове не соответствуют аргументам функции, когда она была объявлена.
Теперь мы можем задать вопрос: почему неявное объявление разрешено на первом месте? Ну, именно так был разработан язык. IMO это ошибка дизайна.
Это может быть правдой, но я не понимаю, как она отвечает на вопрос. – juanchopanza
- 1. Функция с любым количеством аргументов как параметр
- 2. Функции с переменным количеством аргументов - С
- 3. Как сделать функцию с любым количеством аргументов с обратным вызовом
- 4. Использование дженериков в dotnet для функций с любым количеством аргументов?
- 5. функции, перегруженные с различным количеством аргументов
- 6. функции шаблона с различным количеством аргументов
- 7. Функция C++, которая передает любую функцию с любым количеством аргументов
- 8. функции без аргументов работает просто отлично, с аргументами - врежется
- 9. Команды администратора Django с аргументами/без аргументов
- 10. Python: вызов функции с различным количеством аргументов
- 11. C++ - указатель функции с произвольным количеством аргументов
- 12. @Autowired любое имя метода с любым количеством аргументов
- 13. C++: класс шаблона/функция с любым количеством аргументов инициализации
- 14. с помощью функции без аргументов
- 15. resolveInstanceMethod с неизвестным количеством аргументов
- 16. C++ - ошибка с количеством аргументов
- 17. set_target_properties с неправильным количеством аргументов?
- 18. Функция с меньшим количеством аргументов и необязательных аргументов
- 19. Функция Javascript с большим количеством аргументов
- 20. Функции без аргументов
- 21. Указатели на функции с несколькими аргументами в качестве аргументов функции
- 22. C вызов функции с слишком небольшим количеством аргументов
- 23. Как вызвать конструктор с двумя аргументами из конструктора без аргументов?
- 24. Вызов макроса C++ с меньшим количеством аргументов
- 25. TypeScript - Как определить тип функции с аргументами с любым типом
- 26. Отношения между конструктором без аргументов и конструктор с аргументами
- 27. VARIADIC шаблон функции без аргументов шаблона
- 28. аргументов шаблона против аргументов функции
- 29. vprintf() с слишком небольшим количеством аргументов
- 30. F # - Функция без аргументов?
Компиляция с включенными предупреждениями (-Wall). –
И покажите [MCVE] (http://stackoverflow.com/help/mcve). –
Потому что именно так был разработан язык. Вы спрашиваете, почему язык был разработан так? – juanchopanza