2013-09-10 6 views
0

В книге (не помню какой) они использовали:Есть ли случай, когда void main (void) правильный?

void main(void) 

В школе я узнал:

int main(void) 

Есть любом случае когда void main(void) на самом деле правильно? Или, по крайней мере, явно не так?

EDIT: В соответствии с предлагаемыми ответами с C99 это неверно. Как насчет более ранних версий? Является ли это явно неправильным или просто ничего не говорит об этом? Почему компилятор C не жалуется на это?

+4

выбросить эту книгу, пожалуйста. –

+0

[Правильное объявление main()?] (Http://c-faq.com/ansi/maindecl.html) –

+0

Это одно из самых распространенных случаев, когда я должен признать, что ваша школа научила вас правильно. И купите другую книгу. – WhozCraig

ответ

0

void main(void) допускается некоторыми (все?) Компиляторами C. Однако его не следует использовать в любом случае. Потому что по крайней мере с C99 это не разрешено. Однако я не нашел компилятора C, который жалуется на это.

E.g. void.c:

#include <stdio.h> 
void main(void) 
{ 
    printf("hello world"); 
} 

gcc void.c

Собирает. Также проверьте http://www.compileonline.com/compile_c_online.php

Итак, в заключении (хотя я не нахожу ссылку): В ранних версиях C void main(void) был, вероятно, не запрещен.

Однако: Без указания возвращаемого значения вы просто не видите, что возвращает ваша программа. Таким образом, стандартный или нет, правильный или ложный, не используйте его, потому что он делает вашу программу недетерминированной.

+1

http://users.aber.ac.uk/auj/voidmain.cgi – this

+0

Спасибо, так что void main() не разрешен в C++! И также неверно в C (хотя он все еще компилируется). – user2763950

+3

Оба стандарта C & C++ говорят, что 'int main', но компиляторы могут выбрать allow allow' void main' - это не значит, что он будет компилироваться в других компиляторах C или C++. – user93353

2

Никогда, когда-либо использовали void main(void). Это не стандарт.

Всегда используйте один из

int main(void); 

int main(); 

int main(int argc, char **argv); 

int main(int argc, char *argv[]); 

И самое лучшее применение указанной книги является использование его, чтобы осветить ваш первый огонь на зиму.

2

Согласно стандарту C

C99 §5.1.2.2.1 запуска программы

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

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

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

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

или эквивалент; или в некоторых других вариантах реализации.

10) Таким образом, int может быть заменено на имя typedef, определенное как int, или тип argv может быть записан как char **argv и т. Д.

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

+0

Обратите внимание, что «реализация определена» означает, что компилятор должен документировать что 'void main()' является юридической подписью; в противном случае поведение не определено. –

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