2016-03-15 2 views
1

В C, если функция определена с помощью 0 аргументов (пустой список параметров) вызывается с любым количеством аргументов, gcc не дает никаких ошибок. Почему это так?Почему функции с аргументами без аргументов вызываются с любым количеством аргументов?

+2

Компиляция с включенными предупреждениями (-Wall). –

+0

И покажите [MCVE] (http://stackoverflow.com/help/mcve). –

+0

Потому что именно так был разработан язык. Вы спрашиваете, почему язык был разработан так? – juanchopanza

ответ

2

Потому что это то, как функции 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.

1

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.

-2

Рассмотрим этот кусок кода:

//void Test(int a); 

int main() 
{ 
    int a = 0; 
    Test(); 
    return 0; 
} 

Он будет компилироваться (в основном с предупреждением в зависимости от компилятора, настроек и т. Д.), Потому что компилятор предполагает, что Test является функцией, принимающей любое количество аргументов и возвращающим int. Это также называется «неявной декларацией». Вы никогда не должны использовать эту устаревшую функцию языка C.

Если вы раскомментировать первую строку void Test(int a);, она не будет собирать больше, потому что теперь компилятор знает, что Test функция возвращающая int и принимать ровно один аргумент int и как мы называем Test() без аргументов, компилятор может бросить ошибка, потому что аргументы при вызове не соответствуют аргументам функции, когда она была объявлена.

Теперь мы можем задать вопрос: почему неявное объявление разрешено на первом месте? Ну, именно так был разработан язык. IMO это ошибка дизайна.

+0

Это может быть правдой, но я не понимаю, как она отвечает на вопрос. – juanchopanza

Смежные вопросы