2015-10-08 11 views
3

Насколько я знаю, int main(void) требуется по C99 стандартам C11. Так что int main() не подходит для основной функции в этих стандартах.C int main() vs. int main (void)

Но какой стандарт C (не C++) позволяет определить основную функцию int main()?

Спасибо и уважением Alex

+5

C и C++ - разные языки, синтаксис подобен, но семантика - нет. Нет стандарта C, который допускает функцию 'main' с неопределенными аргументами, а в C' int somefunction() 'означает нечто отличное от' int somefunction (void) '. –

+1

@JoachimPileborg, и это означает даже разные вещи, если это найдено в объявлении (только) или в определении. –

+0

Итак, почему мой компилятор C также за исключением int main() {}, а также int main (void)? – knowledge

ответ

2

я лично явно предпочитают версию с (void), потому что, как правило, лучше, чтобы объявить функции с прототипом. Но форма int main() { ... } верна, если вы используете ее в определении, а не в декларации, и на самом деле стандарт C использует эту форму в нескольких примерах.

Здесь это определяет и объявляет функцию без прототипа, но для определения ясно, что эта функция не получает никаких аргументов.

Если вы пытаетесь дать форвардное объявление main, вы не должны использовать эту форму, потому что не было бы предупреждения, если вы вызываете функцию неправильно. Здесь C и C++ также различны, так как C позволяет вам самим вызывать main, даже рекурсивно, где C++ запрещает такие вещи.

1

Согласно C89 (http://web.archive.org/web/20030222051144/http://home.earthlink.net/~bobbitts/c89.txt) метод main определяется двумя способами

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

или

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

Насколько я знаю, это первое определение стандарта, так что я бы предположить int main() хорошо определен только в стандарте C++.

Однако я до сих пор использовать его :)

+0

Связанный стандарт C89 также говорит: «Запуск программы ... Это может быть , определенный без параметров ..int main (void) {/*...*/}« Я не могу что-нибудь о int main() – knowledge

+0

Это была опечатка, я уже исправил ее. – Piters

0

Если вы все еще не уверены, что использовать после того, как другие ответы, я бы рекомендовал иметь определить для пустых параметров:

#if 0 
#define NO_PARAM 
#else 
#define NO_PARAM void 
#endif 

в случае основная функция, которую вы могли бы написать

int main(NO_PARAM){ 
... 
} 

Если после этого вы передумаете, вы можете просто использовать предпочтительный определить без необходимости изменять все подписи функции - который не будет иметь параметров - вручную.

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