2013-07-15 9 views
5

Czytałem o VLA w C Primer Plus, a ta książka ściśle mówi, że wprowadzenie VLA do C zaczęło się od standardu C99. Ilekroć próbuję zadeklarować zmienną sterującą w pętli w nagłówku pętli for, gcc informuje mnie, że akcja ta jest dozwolona tylko w trybie C99. Jednak następujący kod testowy kompiluje się i działa (mimo że wypisuje on zmienne śmieci, czego należy się spodziewać, ponieważ żaden z elementów tablicy nie został zainicjowany).Czy tablice o zmiennej długości naprawdę nie są dozwolone w C90?

#include <stdio.h> 

int main(){ 
    int x; 
    int i = 9; 
    int array[i]; 

    for(x = 0; x < i; x++) 
     printf("%d\n", array[x]); 

    return 0; 
} 

Jeśli nie jestem w trybie C99, w jaki sposób może to być zgodne z prawem?

+0

Z jakiego kompilatora korzystasz? Jakie argumenty przekazujesz podczas kompilacji? –

+0

Musisz otrzymywać 'warning: ISO C90 zabrania tablic o zmiennej długości '' –

+0

[To pytanie] (http://stackoverflow.com/questions/5060799/c99-not-default-c-version-for-gcc) , choć nie jest to dokładnie duplikat, wydaje się mieć znaczenie tutaj. –

Odpowiedz

8

Jeśli nie jestem w trybie C99, w jaki sposób może to być zgodne z prawem?

To nie jest. Jednak GCC pozwala mu jako rozszerzenie kompilatora.

można zmusić GCC być ścisły o to przez przepuszczenie -pedantic flag

$ gcc -std=c89 -pedantic main.c 
main.c: In function ‘main’: 
main.c:6: warning: ISO C90 forbids variable-size array ‘array’ 
+3

Oczywiście implikacja tutaj jest jasna: ** zawsze kompiluj z '-pedantic' ** - i, jeśli o to chodzi,' -Wall -Wextra -Werror' - chyba że istnieje nieodparty powód (dotychczasowy kod, który mógłby się złamać), że nie. –

+0

'-pedantic' może być dość denerwujące o nieużywanych parametrach. Clang ma również flagę '-Weverything', która dość szybko może stać się dość bolesna. –

+1

Użyj '-pedantic-errors'. I skomentuj nieużywane parametry. Lub nie używaj nieużywanych parametrów ... oh czekaj: P – rubenvb

9

Książka jest poprawne, zmienne tablice długości były wspierane od C99 a jeśli budować z następujących opcji:

gcc -std = C89 -pedantic

otrzymasz n ostrzeżenie:

ostrzeżenie: ISO C90 zabrania zmienna długość tablicy „” tablicę [-Wvla]

Jeśli chcesz to być błąd można użyć -pedantic-errors. gcc obsługiwane to jako extension przed c99, można zbudować wyraźnie w trybie c99 i widać żadnych błędów:

gcc -std = C99 -pedantic

The Language Standards Supported by GCC strony idzie w szczegóły, o których standard gcc obsługuje dla C i stwierdza, że:

Domyślnie GCC zapewnia pewne rozszerzenia do języka C, które w rzadkich przypadkach powodują konflikty ct ze standardem C

3

„Jeśli nie jestem w trybie C99, jak to może ewentualnie być legalne?”

Kompilatory mogą posiadać trybach innych niż ściśle zgodnie ze standardem C.

W efekcie standard C to tylko jedna specyfikacja. Nie ma prawa mówiącego, że musisz się do niego dostosować i nie ma prawa mówiącego, że twórca kompilatora musi się do niego dostosować.

Tak więc kompilator może definiować własne odmiany języka i kompilować je przy użyciu własnej specyfikacji, a nawet specyfikacji napisanej przez osobę trzecią.

Co więcej, standard C definiuje język, który można rozszerzyć. Istnieje wiele zachowań, których implementacja może zostać zdefiniowana, zachowując zgodność ze standardem C. Standard C określa nawet, że program zgodny jest jakimkolwiek programem akceptowanym dla zgodnej implementacji. Oznacza to, że program, który używa rozszerzenia kompilatora, nadal jest zgodnym programem C (przy braku jakichkolwiek innych problemów). (Jednak nie jest to program ściśle zgodny, są to programy, które nie używają rozszerzeń.)

Powiązane problemy