Основной C++ против основного C

Я читаю документ о C ++ и C. В документе говорится, что C ++ жестко написан по сравнению с C. Один пример: C позволяет типу функции main() быть недействительным. С другой стороны, С++ не позволяет этого, и он дал приведенное ниже утверждение из стандарта.

В стандарте С++:

Он должен иметь возвращаемый тип int, но в остальном его тип определяется реализацией. Все реализации должны допускать оба следующих определения main:

int main() { /* … */ }

а также

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

Стандарт C говорит то же самое, но имеет дополнительное утверждение.

Если возвращаемый тип не совместим с int, состояние завершения, возвращаемое в хост-среду, не указано.

что указывает на то, что разрешение форм, которые не возвращают int, является преднамеренным.

Когда у вас есть тип оператора, который может быть определен реализацией, вы не даете возможности сообществу разработчиков компилятора С++ разрешить void как тип?


person Ram    schedule 04.03.2012    source источник
comment
Main в C всегда должен возвращать int   -  person Flexo    schedule 04.03.2012
comment
Какой именно документ вы читаете? Стандартный C написан ничуть не менее жестко, чем стандартный C++.   -  person fredoverflow    schedule 04.03.2012
comment
ISO/IEC 9899:1999 5.1.2.2.1 и 5.1.2.2.3 для C. ISO/IEC 14882:1998 для cpp.   -  person Ram    schedule 04.03.2012
comment
@awoodland: см. ответ Керрека...   -  person Oliver Charlesworth    schedule 04.03.2012
comment
@awoodland, компилятор gcc не жаловался на оператор void main (void). на другом g++ для оператора void main (недействительно), error:: main должен возвращать целое число.   -  person Ram    schedule 04.03.2012
comment
@ram, когда вы тестируете gcc на соответствие стандартам, всегда используйте -pedantic-errors. Затем gcc 4.6.2 сообщит об ошибке: возвращаемый тип «main» не «int» [-Wmain]   -  person Matthew Flaschen    schedule 04.03.2012


Ответы (2)


И C, и C++ требуют, чтобы любая реализация языка поддерживала формы int main(void) и int main(int, char**). Однако в стандартах также говорится, что реализация может поддерживать дополнительные формы, и, таким образом, программа, использующая одну из этих других форм, не является автоматически недействительной — скорее, это допустимая программа, которая для поддержки на определенных платформах.

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

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

person Kerrek SB    schedule 04.03.2012
comment
@ kerrek SB, теперь можно с уверенностью предположить, что С++ имеет возможность поддерживать все варианты main при условии, что main () всегда должна возвращать значение, а его тип должен быть «int». Для main() в 'c' таких ограничений нет. - person Ram; 04.03.2012
comment
@ram: Не поймите неправильно: C++ — это стандарт абстрактного языка. У него нет никаких способностей. Это просто официальный документ. Это говорит о том, что ваш код правильно сформирован, если он имеет любую из разрешенных форм main, но вы можете ожидать, что любой данный компилятор скомпилирует его только в том случае, если он имеет одну из двух стандартных форм. В противном случае ваш компилятор должен явно поддерживать вашу форму. - person Kerrek SB; 04.03.2012

С++

Он должен иметь возвращаемый тип int, но в остальном его тип определяется реализацией.

Это означает, что возвращаемый тип должен быть int, но параметры main могут определяться реализацией. Таким образом, есть возможность для конкретных параметров реализации в main, но нет возможности для изменения типа возвращаемого значения int.

С

C более снисходителен к допустимым типам возврата main. Он позволяет возвращать типы, отличные от int.

person David Heffernan    schedule 04.03.2012
comment
вы имеете в виду аргументы командной строки? не могли бы вы подробнее рассказать о том, что вы на самом деле имеете в виду? тк. - person Ram; 04.03.2012
comment
Формальные параметры основной функции могут быть определены реализацией. Но не тип возвращаемого значения. Это должно быть инт. - person David Heffernan; 04.03.2012