Основное значение возврата GCC по умолчанию не равно нулю
У меня есть некоторые C-программы без явного возврата из main, например:
int main(int argc, char *argv[])
{
// blah blah
}
Если я скомпилирую их с помощью GCC 4.6.3 и следующих параметров:
gcc file.c -Wall -Wextra
Программы не возвращают 0 и не дают мне проблем, но стандарт (и много других ответов на SO) говорит:
Если тип возврата основной функции является типом, совместимым с int, возврат от начального вызова к основной функции эквивалентен вызову функции выхода со значением, возвращаемым основной функцией в качестве аргумента; [10] достижение}, который завершает основную функцию, возвращает значение 0. Если тип возврата несовместим с int, статус завершения, возвращаемый в среду хоста, не указан.
[10] В соответствии с 6.2.4 времена жизни объектов с автоматической продолжительностью хранения, объявленные в основном, закончились бы в первом случае, даже если они не были бы в последнем.
Мои программы возвращают разные значения, 160, 15, 14... мусор?
Я что-то упустил? Это ошибка GCC? Не удается найти что-либо в онлайн-документе GCC.
Является ли GCC еще ссылкой на какой-то старый стандарт C (pre-C99), где это не может быть указано?
Ответы
Ответ 1
По умолчанию gcc
есть -std=gnu89
, который является расширениями C90 + GNU.
И C90 говорит:
(C90, 5.1.2.2.3) "Если основная функция выполняет возврат, который не задает значения, статус завершения, возвращаемый в среду хоста, равен undefined"
Скомпилируется с -std=c99
или -std=gnu99
, чтобы иметь возвращаемое значение 0
, когда в основной функции возврат не указывается.