2012-10-17 6 views
10

Mam kilka programów C bez wyraźnego zwrotu z głównym, tak:domyślna wartość GCC główny powrót nie jest zero

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

Gdybym je skompilować z GCC 4.6.3 oraz następujące opcje:

gcc file.c -Wall -Wextra 

programów nie zwraca 0 i dać mi problemów, ale średnia (i wiele innych odpowiedzi na SO) mówi:

Jeśli typ zwracany głównej funkcji jest typem zgodnym z int, zwrot z początkowego wywołania do funkcji głównej jest równoważny wywołaniu funkcji wyjścia z wartością zwracaną przez funkcję główną jako jej argumentem; [10] osiąga wartość} kończącą główna funkcja zwraca wartość 0. Jeśli typ zwracany nie jest zgodny z int, stan zakończenia zwracany do środowiska hosta jest nieokreślony.

[10] Zgodnie z 6.2.4, okresy życia obiektów z automatycznym czasem przechowywania zadeklarowane w głównej części zostaną zakończone w pierwszym przypadku, nawet jeśli nie będą miały miejsca w drugim.

Moje programy zwracają różne wartości, 160, 15, 14 ... śmieci?

Czy brakuje mi czegoś? Czy to jest błąd GCC? Nie można znaleźć niczego w internetowym dokumencie GCC. Czy GCC wciąż odnosi się do jakiegoś starego standardu C (pre-C99), gdzie nie można tego określić?

+3

skompiluj go za pomocą '-std = c99'. –

+0

Spróbuję, dzięki. – effeffe

+0

@ BlueMoon: Jeszcze lepiej, dodaj 'return 0;' na końcu 'main'. Jest nieszkodliwy w trybie C99. –

Odpowiedz

13

Domyślnie gcc jest -std=gnu89 co stanowi rozszerzenie C90 + GNU.

I C90 mówi:

(C90, 5.1.2.2.3) „Jeśli główną funkcją wykonuje zwrot, który określa żadnej wartości, status zakończenie powrócił do środowiska docelowego jest niezdefiniowana”

Kompiluje się z -std=c99 lub -std=gnu99, aby uzyskać wartość zwracaną 0, gdy powrót jest pominięty w funkcji głównej.