2012-02-07 11 views
7

Mam bardzo duży program, który kompiluje z gcc bez ostrzeżeńCzy istnieje jakiś sposób, aby umożliwić for (int i = 0;. ... w gcc bez konieczności włączania trybu c99

Jeśli zwracam tryb c99 --std = c99 w linii poleceń, daje ogromną liczbę ostrzeżeń i błędów.

Ale kocham idiomu for(int i=0; i<20; i++){ code }

zamiast {int i; for (i=0; i<20; i++){ code }}

Czy istnieje jakiś sposób, aby powiedz gcc, aby zezwolić na to i tylko to?

Czy jest jakiś sposób włączenia trybu C99 w poszczególnych funkcjach, nad którymi pracuję? Coś jak

#pragma c99 on 

for(int i=0; i<99; i++) 
{ 
    code 
} 

#pragma c99 off 
+3

ANSI C zabrania mieszankę deklaracji i sprawozdań z jakiegoś powodu . Powinieneś zadeklarować wszystkie swoje zmienne u góry swojej funkcji i to wszystko. Jeśli boisz się ich utracić lub zmieszać, funkcja ma zbyt wiele linii i należy ją posegmentować. – Eregrith

+2

Co stanie się, gdy spróbujesz skompilować swój kod w trybie 'gnu99' (w przeciwieństwie do' c99')? – NPE

+22

Ten komentarz oznacza "głosuj przeciwko" Eregrithowi. Istnieją dobre powody, dla których C89 pozwala definiować zmienne u góry * dowolnego * bloku, a nie tylko ciało funkcyjne, jak wymaga tego przewodnik stylu Eregritha. Istnieją również dobre powody, dla których kilka innych języków i bardzo niewiele języków współczesnych ma taki wymóg. Nie podążaj za stylem Eregritha, nawet w C89. Powód, dla którego C89 zabraniał mieszać definicje i inne stwierdzenia, jest dość słaby - w dużej mierze był historyczny w 1989 roku i miał do czynienia z ciężkimi, starymi kompilatorami, które w prosty sposób układały ramki stosów. –

Odpowiedz

7

Jest prawdopodobne, że ostrzeżenia i błędy są bo -std=c99 wniosków o standardowej zgodnej C99, co oznacza, że ​​wiele funkcji dla konkretnych platform, które zanieczyszczają przestrzeń nazw C99 nie są zdefiniowane.

Zamiast tego powinieneś spróbować --std=gnu99, który jest odpowiednikiem C99 domyślnego trybu gnu89.

+0

Lub lepiej, użyj '-std = c99', a następnie zdefiniuj poprawne makra testów właściwości dla tego, czego chcesz użyć (prawdopodobnie' -D_XOPEN_SOURCE = 700'). –

2

Ewentualnie użyć -std = gnu99 można wyłączyć poszczególne ostrzeżenia:

 
-Wno-declaration-after-statement 

Czytaj info gcc:

 
`-Wdeclaration-after-statement (C and Objective-C only)' 
    Warn when a declaration is found after a statement in a block. 
    This construct, known from C++, was introduced with ISO C99 and is 
    by default allowed in GCC. It is not supported by ISO C90 and was 
    not supported by GCC versions before GCC 3.0. *Note Mixed 
    Declarations::. 
+0

Problem polega na tym, że jest to * błąd *, a nie ostrzeżenie, gdy jesteś w trybie c89. –

Powiązane problemy