Разница между основными (void) и main () в C

Может ли кто-нибудь сказать мне разницу между int main() и int main(void) ? Почему оба они работают и что является аргументом по умолчанию для int main() ?

Никакой разницы при обычных обстоятельствах. Это не аргумент default для main () ‘, поскольку он вообще не имеет аргументов.

Вот необычное обстоятельство. Если вы напишете свой собственный вызов main, то () позволит вам передать ему любые параметры, которые вам нравятся, в то время как (void) заставит вас передать его никому. Тем не менее, ничто из этого не имеет значения в случае 99.99999999%, который является основным вызовом среды выполнения для запуска вашей программы. Время выполнения не знает и не заботится, если вы пишете () или (void) .

Если вы кодируете стандартный int main(int argc, char **argv) вы получите там параметры командной строки.

main() позволяет вам называть main с любым количеством параметров. main(void) заставляет вас называть main без параметров. Так:

 main(foo, bar); 

Прекрасно работает с main() но не с main(void) – компилятор генерирует ошибку.

Теперь, если вы специально спрашиваете о точке входа в программу, это не имеет особого значения; в любом случае у вас не будет аргументов в программе (argc, argv, envp).

С практической точки зрения нет никакой реальной разницы. С int main(void) вы явно указываете, что main принимает никаких параметров, поэтому вы не можете вызывать его с помощью каких-либо. С помощью функции int main() вы оставляете возможность вызова main с некоторыми параметрами.

Однако, за исключением странных ситуаций, таких как кодовый гольф или умышленно запутанный код, вы все равно не вызываете main – это точка входа в программу, поэтому он автоматически вызывается кодом запуска. Код запуска будет передавать аргументы командной строки в любом случае, поэтому ваши варианты не изменяют способ его вызова, только если вы используете или игнорируете передаваемые параметры.

Стандарт специально позволяет вам определять main с параметрами или без них (§5.1.2.2.1 / 1):

Функция, вызванная при запуске программы, называется main. Реализация не объявляет прототипа для этой функции. Он должен быть определен с типом возврата int и без параметров:

  int main(void) { /* ... */ } 

или с двумя параметрами (называемыми здесь argc и argv, хотя любые имена могут использоваться, поскольку они являются локальными для функции, в которой они объявлены):

  int main(int argc, char *argv[]) { /* ... */ } 

или эквивалент;

Хотя это не указано в тегах, в C ++ ситуация немного отличается. В C объявление функции:

 int f(); 

указывает, что f является функцией, возвращающей int , но не дает никакой информации о количестве или типе параметров f могли бы ожидать (в первую очередь это относится к совместимости со старым кодом), это был единственный способ объявить функцию в С). В C ++ это же объявление явно объявляет f как функцию, которая не принимает никаких параметров, поэтому попытка вызвать f с одним или несколькими параметрами не может вызвать эту функцию (она должна либо вызвать другую перегрузку, либо вызвать ошибку, если подходящая перегрузка не найдена).