LINUX.ORG.RU

Error: ‘::main’ must return ‘int’

 


0

5

Забавный факт: в новых стандартах плюсов main не может быть non-int и даже void. Но в чём причина такого регламента? Допустим, в некоторой POSIX-несовместимой 32-битной ОС разрешён возврат программой int64_t (или даже int128_t), при том, что int для неё будет определён как 32-битное число. Выходит, С++ может оказаться принципиально не совместимым (строго говоря) с такой ОС?

★★★★★

Последнее исправление: next_time (всего исправлений: 1)

Тема в «похожих» от 2010 года намекает, что C++11 тут не причём.

void можно было возвращать в Visual C++.

i-rinat ★★★★★
()

в новых стандартах плюсов main не может быть non-int и даже void

В старых тоже.

theNamelessOne ★★★★★
()
Ответ на: комментарий от i-rinat

не всё так однозначно

If the return type of the main function is not compatible with int (e.g. void main(void)), the value returned to the execution environment is unspecified

http://en.cppreference.com/w/c/language/main_function

Впрочем, как-то безразлично, в каком стандарте запретили. Меня больше интересует собственно сабж.

next_time ★★★★★
() автор топика
Ответ на: комментарий от next_time

Вообще это warning. Включил параметр командной строки «трактовать предупреждения как ошибки»? Тебя ждёт много сюрпризов. Например в некоторых библиотеках используется директива предупреждения (типа устарело и т.п.).

anonymous
()

На такой замечательной ОС сишный рантайм может предоставлять аналог функции exit с подходящим типом аргумента. Или разрешить определять функцию с особенным именем и правильными параметрами и возвращаемым типом вместо стандартной main.

const86 ★★★★★
()
Ответ на: комментарий от const86

Или разрешить определять функцию с особенным именем и правильными параметрами и возвращаемым типом вместо стандартной main.

Это-то ясно. Но это уже будет не строго соответствующий стандарту С++.

На такой замечательной ОС сишный рантайм может предоставлять аналог функции exit с подходящим типом аргумента.

Только такую функцию юзер вынужден будет вызывать вручную и выглядит как костыль.

Но меня больше интересует не это само по себе, а как обычно реализуется возврат их приложения на системном уровне. На программном ясно: написал ретурн или exit(целое число) и норм. Но вот как это дело на практике реализовано на уровне системы — вопрос интересный. В принципе, может быть ясно, почему именно инт, а не строка, например: память толстых переменных сидит в динамической памяти, или в статической, или в стеке приложения, короче будет удалена после завершения приложения. Скорее всего, возврат данных производится через регистры, сискал или что-то такое (в любом случае, ОС-зависимо). Но не ясно тогда, почему запрещён возврат void ведь ОС может вообще не поддерживать коды возврата. И почему запрещён float, ведь на большинстве систем он занимает ровно столько же места, сколько int.

next_time ★★★★★
() автор топика
Ответ на: комментарий от next_time

Но вот как это дело на практике реализовано на уровне системы — вопрос интересный.

В Linux — вот так.

Но не ясно тогда, почему запрещён возврат void

Потому что возврат из main эквивалентен вызову std::exit(), которая принимает int.

И почему запрещён float, ведь на большинстве систем он занимает ровно столько же места, сколько int.

Хотя бы потому, float-значения укладываются в свои floating-point регистры, а ядро работает только с целочисленными.

anonymous
()
Ответ на: комментарий от next_time

Ах да, ещё.

Это-то ясно. Но это уже будет не строго соответствующий стандарту С++.

Будет. Стандарт не обязывает определять main() во всех корректных программах.

anonymous
()
Ответ на: комментарий от anonymous

а ядро работает только с целочисленными.

не обязано же

но, в любом случае, теперь ясно, спасибо

next_time ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.