Вызов функций C с неопределенным числом параметров

#c #function-call

#c #вызов функции

Вопрос:

Обратите внимание, что этот вопрос не относится к многоточию.

Рассмотрим следующий код

 #include <stdio.h>

void foo() {
    printf("I AM AWESOMEn");
}

main(void) {
    foo(1,2,3);
    foo();
return 0;
}
  

Эта программа работает отлично и обеспечивает вывод.
Однако в случае ‘main’ это работает независимо от

main(void)

или

main()

Когда, определяя foo как

foo(void)

выдает ошибку — «слишком много аргументов».

Если обе функции являются функциями, не должны ли они также следовать тем же правилам?

Комментарии:

1. Это не работает «идеально», поскольку вы должны получить предупреждение об отсутствующей сигнатуре функции для foo() . Короткий ответ заключается в том, что main это особенное, и к нему применяются разные правила.

2. Есть ли какая-либо причина, по которой вы хотели бы использовать foo() ? Вероятно, это будет удалено в следующем стандарте.

3. main() это поведение, определяемое реализацией, и реализации обычно принимают его. Однако вы никогда не должны его использовать.

4. Стандарт разрешает только явно int main(void) и int main(int argc, char *argv[]) . Все, что отличается, вызывает проблемы. Компиляторы могут разрешать разные main сигнатуры или нет.

5. c — это другая история. () то же (void) самое, что и там.

Ответ №1:

Когда вы объявляете функцию без параметров, это означает отключить проверку типов и использовать соглашение о вызовах K amp; R. Это не означает, что у функции нет параметров.

В ANSI, когда вы хотите явно указать, что функция не имеет параметров, вам нужно объявить ее как fun(void) .

Ответ №2:

также есть что-то еще в C, называемое переменным числом аргументов

  void foo(int x, ...)
  

https://www.geeksforgeeks.org/variable-length-argument-c/

Комментарии:

1. уважаемый сэр / мэм, пожалуйста, внимательно прочитайте примечание, приведенное в начале вопроса

Ответ №3:

foo(void) Не принимает аргументов (!!!), тогда foo() как принимает неопределенное количество аргументов!

Комментарии:

1. Вот в чем мой вопрос, не должен ли main также принимать неопределенное количество аргументов? Если не объявлено с void и без аргументов, если объявлено с ‘void’?

2. и, если это так, является ли ‘foo() может вызываться с неопределенным количеством аргументов’ ошибкой или особенностью?

3. Почему вы заботитесь о функции main? вы не вызываете main с параметрами, просто вызываете foo() . Это независимо от main, как вы написали, потому что вы его не вызывали (система вызывает его).

4. Не выполняется ли системный вызов _Start, который, в свою очередь, вызывает main ?

5. @kesarling Вы можете вызывать main(); внутри своей программы в любой момент, и это законно. Однако я не знаю ни одной ситуации, когда это было бы желательно. Может быть, вы можете попробовать и повеселиться 🙂