Ta notatka mówi:
-ansi
: informuje kompilator, aby zaimplementował opcję języka ANSI. Powoduje to wyłączenie pewnych „funkcji” GCC, które są niezgodne ze standardem ANSI.
-pedantic
: używane w połączeniu z-ansi
, mówi kompilatorowi, aby ściśle przestrzegał standardu ANSI, odrzucając każdy kod, który nie jest zgodny.
Po pierwsze:
- Jaki jest cel
-pedantic
i-ansi
opcje kompilatora GCC / G ++ (nie mogłem zrozumieć powyższego opisu)? - Czy ktoś może mi powiedzieć, w jakich okolicznościach należy użyć tych dwóch opcji?
- Kiedy powinienem ich używać?
- Czy są ważne?
Używam go cały czas w moim kodowaniu.
-ansi
Flaga jest równoważna-std=c89
. Jak wspomniano, wyłącza niektóre rozszerzenia GCC. Dodanie-pedantic
wyłącza więcej rozszerzeń i generuje więcej ostrzeżeń. Na przykład, jeśli masz literał ciągu dłuższy niż 509 znaków,-pedantic
ostrzega o tym, ponieważ przekracza minimalny limit wymagany przez standard C89. Oznacza to, że każdy kompilator C89 musi akceptować łańcuchy o długości 509; mogą akceptować dłużej, ale jeśli jesteś pedantyczny, używanie dłuższych ciągów nie jest przenośne, nawet jeśli kompilator może akceptować dłuższe ciągi i bez pedantycznych ostrzeżeń, GCC też je zaakceptuje.źródło
-std=c89 -pedantic
oznacza, że możesz łatwiej poruszać się między różnymi kompilatorami na innych platformach. Jak tylko zaczniesz używać<windows.h>
, kompatybilność z innymi systemami staje się problematyczna.-pedantic
, ale większość mojego kodu nadal kompiluje się dobrze po ponownym włączeniu (jeden program, który tego nie robił, jawnie używał__int128
typów, które są pedantycznie niepoprawne). Myślę, że był etap pośredni, kiedy GCC było zbyt głośne (jak na mój gust)-pedantic
. Właśnie przetestowałem około 300 plików źródłowych - trochę kodu biblioteki, kilka poleceń, kilka programów testowych SO - i był tylko jeden, którego można się było spodziewać. Obecnie używasz GCC 4.8.2 w systemie Mac OS X 10.9.2.-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 programProjekt C11 n1570, paragraf 6.7.6.2p1 mówi :
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 :
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: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.źródło
-std=c11 -Wall -Wextra -Wpedantic -Wconversion
.Zasadniczo znacznie ułatwi to kompilację kodu pod innymi kompilatorami, które również implementują standard ANSI, i, jeśli uważasz, w których bibliotekach / wywołaniach API używasz, w innych systemach operacyjnych / platformach.
Pierwsza z nich wyłącza SZCZEGÓLNE funkcje GCC. (-ansi) Drugi będzie narzekał na WSZYSTKO, co nie jest zgodne ze standardem (nie tylko specyficzne cechy GCC, ale także twoje konstrukcje). (-pedantyczny).
źródło
Jeśli Twój kod musi być przenośny , możesz sprawdzić, czy kompiluje się bez żadnych rozszerzeń gcc lub innych niestandardowych funkcji. Jeśli twój kod kompiluje się z,
-pedantic -ansi
to teoretycznie powinien skompilować się dobrze z każdym innym standardowym kompilatorem ANSI.źródło
-pedantic
nie wyłącza wszystkich rozszerzeń, pozostawia kilka elementów z podwójnym podkreśleniem. Dlatego dokładniejsze może być stwierdzenie, że jeśli twój kod kompiluje się z programem-pedantic -ansi
, a także wygląda na to, że może się skompilować w innych implementacjach, to się skompiluje.Jeśli piszesz kod, który według Ciebie ma być kompilowany na wielu różnych platformach, z wieloma różnymi kompilatorami, to użycie tych flag pomoże Ci upewnić się, że nie tworzysz kodu, który kompiluje się tylko pod GCC.
źródło
Inni odpowiedzieli dostatecznie. Chciałbym tylko dodać kilka przykładów częstych rozszerzeń:
main
Funkcja powrocievoid
. Nie jest to zdefiniowane w standardzie, co oznacza, że będzie działać tylko na niektórych kompilatorach (w tym GCC), ale nie na innych. By the way,int main()
iint main(int, char**)
są dwa podpisy, że standard nie definiuje.Innym popularnym rozszerzeniem jest możliwość deklarowania i definiowania funkcji wewnątrz innych funkcji:
To jest niestandardowe. Jeśli chcesz tego rodzaju zachowania, sprawdź lambdy języka C ++ 11
źródło
Pedantic sprawia, że kompilator gcc odrzuca wszystkie rozszerzenia GNU C, a nie tylko te, które czynią go kompatybilnym z ANSI.
źródło