#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, ...)
Комментарии:
1. уважаемый сэр / мэм, пожалуйста, внимательно прочитайте примечание, приведенное в начале вопроса
Ответ №3:
foo(void)
Не принимает аргументов (!!!), тогда foo()
как принимает неопределенное количество аргументов!
Комментарии:
1. Вот в чем мой вопрос, не должен ли main также принимать неопределенное количество аргументов? Если не объявлено с void и без аргументов, если объявлено с ‘void’?
2. и, если это так, является ли ‘foo() может вызываться с неопределенным количеством аргументов’ ошибкой или особенностью?
3. Почему вы заботитесь о функции main? вы не вызываете main с параметрами, просто вызываете foo() . Это независимо от main, как вы написали, потому что вы его не вызывали (система вызывает его).
4. Не выполняется ли системный вызов _Start, который, в свою очередь, вызывает main ?
5. @kesarling Вы можете вызывать
main();
внутри своей программы в любой момент, и это законно. Однако я не знаю ни одной ситуации, когда это было бы желательно. Может быть, вы можете попробовать и повеселиться 🙂