2012-01-20 14 views
20

Jakie opcje GCC należy ustawić tak, aby GCC było jak najbardziej rygorystyczne? (i mam na myśli tak ścisłą, jak to tylko możliwe) Piszę w C89 i chcę, aby mój kod był zgodny z ANSI/ISO.Opcje GCC dla najściślejszego kodu C?

+0

Dla najsurowszych powinno być jasne, które standardowo są kierowane. ANSI X3.159-1989 i/lub ISO/IEC 9899: 1990, ISO/IEC 9899: 1999 lub "C1X" z grupy roboczej ISO/IEC (http://www.open-std.org/JTC1/SC22/ WG14) (JTC1/SC22/WG14). ANSI C i ISO C90 różnią się tylko numeracją sekcji samego standardu AFAIK – mctylr

+0

@mctylr: "Piszę w C89" wydaje się zupełnie jasne. –

+2

Ściśle mówiąc, C89 nie jest zgodny z ANSI/ISO. Obecny standard ISO C opublikowano w 2011 r .; to także obecny standard ANSI C; normy z lat 1989, 1990 i 1999 są oficjalnie przestarzałe. Ale to tylko spór o sformułowanie; nadal istnieje powszechne wsparcie dla C89/C90 (więcej niż dla C99), i nadal można go dostosować, nawet jeśli nie jest już oficjalnym standardem. –

Odpowiedz

18

Polecam przy użyciu:

-Wall -Wextra -std=c89 -pedantic -Wmissing-prototypes -Wstrict-prototypes \ 
    -Wold-style-definition 

należy skompilować z -O jak również -g niektóre ostrzeżenia są dostępne tylko wtedy, gdy używany jest optymalizator (faktycznie, ja zwykle korzystam -O3 na plamienie problemów). Możesz preferować -std=gnu89, ponieważ spowoduje to wyłączenie mniejszej liczby rozszerzeń w bibliotekach. OTOH, jeśli kodujesz do ścisłego ANSI C89, może chcesz, żeby były wyłączone. Opcja -ansi jest odpowiednikiem -std=c89, ale nie jest tak wyraźna ani elastyczna.

Brakujące prototypy ostrzega o funkcjach, które są używane (lub zdefiniowane funkcje zewnętrzne) bez prototypu w zakresie. Surowe prototypy oznaczają, że nie można używać "pustych nawiasów" do deklaracji funkcji lub definicji (lub wskaźników funkcji); potrzebujesz (void) lub poprawnej listy argumentów. Definicja starym stylu spoty K & definicje funkcji w stylu R, takie jak:

int old_style(a, b) int a; double b; { ... } 

Jeśli masz szczęście, nie trzeba się martwić o to. Nie mam tyle szczęścia w pracy i nie mogę użyć ścisłych prototypów, ku mojemu rozczarowaniu, ponieważ jest zbyt wiele niedbałych wskaźników funkcji.

Zobacz także: What is the best command-line tool to clean up code

+1

"W-wychodzące-prototypy" - prototypy-prototypy-opcje-w-stylu "są dobrym pomysłem, ale nie odnoszą się do standardowej zgodności. Deklaracje i definicje funkcji w starym stylu są przestarzałe od 1989 roku, ale wciąż są częścią języka; nawet kompilatory zgodne z C2011 są wymagane do ich obsługi. –

+1

@Keith: masz włączoną flagę '-pedantic' w swoim czytaniu: D Tak, ale nadal zalecamy używanie opcji, aby kod był maksymalnie przenośny do przyszłych wersji standardu. Nie zdziwiłoby mnie, że C2021 w końcu traci standardowe wsparcie dla funkcji nieprototypowych, chociaż implementacje prawdopodobnie będą nadal wspierać stare zapisy przez następne 10-20 lat. C11 eliminuje również 'gets()'; Nie spodziewam się, że zniknie z bibliotek także przez długi czas. Należy tego unikać, nawet jeśli jest w pełni zgodny z C89. –

+0

Napisałem post na ten temat: http://shitalshah.com/p/how-to-enable-and-use-gcc-strict-mode-compilation/ – ShitalShah

6

Ten zestaw opcji jest dość dobre: ​​

-Wall -Wextra -ansi -pedantic 

Musisz zapoznać się z dokumentacją, aby zobaczyć, czy są jakieś dodatkowe ostrzeżenia coraz pozostawione przez tego połączenia.

Należy ostrzec, że ścisłe C89 nie obejmuje obsługi komentarzy w stylu //, a istnieją pewne poważne poważne ograniczenia dotyczące liczby znaczących znaków w nazwach obiektów z zewnętrznym powiązaniem.

+0

Dokumentacja mówi, że "-ansi -pedantic" powinno uzyskać ścisłą ISO C90 i będzie ostrzegać na DOWOLNYM rozszerzeniu GNU C (nie tylko tym, które są niekompatybilne). Możesz użyć "-pedantic-errors", jeśli chcesz błędów. Chociaż nie jest to kwestia surowości, możesz rozważyć "-Werror", który zmieni ostrzeżenia w błędy. Filozoficznie "Ostrzeżenia nie są błędami" –