-ansi
jest przestarzały przełącznik, który żąda kompilator skompilować zgodnie z 30-letnim przestarzałego rewizji standardu C , ISO / IEC 9899: 1990 , który jest zasadniczo rebranding z ANSI X3.159-1989 „Język programowania C . Dlaczego przestarzałe? Ponieważ po opublikowaniu C90 przez ISO, ISO było odpowiedzialne za standaryzację C, a wszelkie poprawki techniczne do C90 zostały opublikowane przez ISO -std=c90
.
Bez tego przełącznika najnowsze kompilatory GCC C będą zgodne z językiem C znormalizowanym w ISO / IEC 9899: 2011 lub najnowszej wersji 2018.
Niestety, są niektórzy leniwi dostawcy kompilatorów, którzy uważają, że dopuszczalne jest trzymanie się starszej, przestarzałej wersji standardu, dla której dokument normalizacyjny nie jest nawet dostępny w jednostkach standardowych.
Korzystanie z przełącznika pomaga zapewnić, że kod powinien zostać skompilowany w tych przestarzałych kompilatorach.
To -pedantic
jest interesujące. W przypadku braku -pedantic
, nawet jeśli zażądano określonego standardu, GCC nadal będzie zezwalać na niektóre rozszerzenia, które nie są akceptowane w standardzie C. Weźmy na przykład program
struct test {
int zero_size_array[0];
};
Projekt C11 n1570, paragraf 6.7.6.2p1 mówi :
Oprócz opcjonalnych kwalifikatorów typu i słowa kluczowego static, [i] może ograniczać wyrażenie lub *. Jeśli ograniczają wyrażenie (które określa rozmiar tablicy), wyrażenie powinno mieć typ całkowity. Jeżeli wyrażenie jest wyrażeniem stałym, powinno mieć wartość większą od zera. […]
Standard C wymaga, aby długość tablicy była większa niż zero; a ten ustęp jest w ograniczeniach ; norma mówi, co następuje 5.1.1.3p1 :
Zgodna implementacja powinna wygenerować co najmniej jeden komunikat diagnostyczny (zidentyfikowany w sposób zdefiniowany w implementacji), jeśli jednostka translacyjna lub jednostka translacyjna przetwarzająca wstępnie zawiera naruszenie jakiejkolwiek reguły składniowej lub ograniczenia, nawet jeśli zachowanie jest również wyraźnie określone jako nieokreślone lub implementacja zdefiniowane. W innych okolicznościach komunikaty diagnostyczne nie muszą być generowane.
Jeśli jednak skompilujesz program z gcc -c -std=c90 pedantic_test.c
, nie zostanie wyświetlone żadne ostrzeżenie.
-pedantic
powoduje, że kompilator faktycznie jest zgodny ze standardem C ; więc teraz wyświetli komunikat diagnostyczny, zgodnie z wymaganiami normy:
gcc -c -pedantic -std=c90 pedantic_test.c
pedantic_test.c:2:9: warning: ISO C forbids zero-size array ‘zero_size_array’ [-Wpedantic]
int zero_size_array[0];
^~~~~~~~~~~~~~~
Tak więc, aby zapewnić maksymalną przenośność, określenie wersji standardu nie wystarczy, należy również użyć -pedantic
(lub -pedantic-errors
), aby upewnić się, że GCC rzeczywiście jest zgodne z literą normy.
Ostatnia część pytania dotyczyła używania -ansi
z C ++ . ANSI nigdy nie znormalizowało języka C ++ - tylko przejęło go z ISO, więc ma to tyle samo sensu, co powiedzenie „angielski zgodnie z normą we Francji”. Jednak GCC nadal wydaje się akceptować to dla C ++, tak głupio jak się wydaje.