-ansi
30 살에 따라 컴파일하는 컴파일러를 요구하는 사용되지 않는 스위치입니다 C 표준의 오래된 개정 , 1990 : ISO / IEC 9899 , 기본적으로 ANSI 표준의 브랜딩입니다 언어 C 프로그래밍 X3.159-1989는 " . 더 이상 사용되지 않는 이유 ISO에서 C90을 게시 한 후에는 ISO가 C 표준화를 담당 하고 C90에 대한 모든 기술 코드 가 ISO에 의해 게시되었으므로을 사용하는 것이 더 적합합니다 -std=c90
.
이 스위치가 없으면 최신 GCC C 컴파일러는 ISO / IEC 9899 : 2011 또는 최신 2018 개정판 에서 표준화 된 C 언어를 준수합니다 .
불행히도 구식의 표준 개정판을 고수 할 수 있다고 믿는 일부 게으른 컴파일러 공급 업체가 있습니다. 표준 개정판은 표준 본문에서도 사용할 수 없습니다.
스위치를 사용하면 코드가 이러한 오래된 컴파일러에서 컴파일되어야합니다.
는 -pedantic
흥미로운 하나입니다. 가 없으면 -pedantic
특정 표준이 요청 된 경우에도 GCC는 C 표준에서 허용되지 않는 일부 확장을 허용합니다. 예를 들어 프로그램을 고려하십시오
struct test {
int zero_size_array[0];
};
C11 초안 n1570 단락 6.7.6.2p1는 말한다 :
선택적 유형 한정자 및 키워드 static 외에도 [및]는 표현식 또는 *를 구분할 수 있습니다. 배열의 크기를 지정하는 표현식을 구분하면 표현식은 정수 유형이어야합니다. 표현식이 상수 표현식 인 경우 0보다 큰 값을 가져야합니다. [...]
C 표준에서는 배열 길이가 0보다 커야합니다. 이 단락은 제약 조건에 있습니다 . 표준은 다음 5.1.1.3p1을 말합니다 .
전처리 번역 단위 또는 번역 단위가 구문 규칙 또는 제약 조건의 위반을 포함하는 경우, 행동이 명시 적으로 정의되지 않았거나 구현으로 명시되어 있더라도, 적합한 구현은 적어도 하나의 진단 메시지 (구현 정의 방식으로 식별)를 생성해야한다. 한정된. 다른 상황에서는 진단 메시지를 작성할 필요가 없습니다 .9)
그러나로 프로그램을 컴파일하면 gcc -c -std=c90 pedantic_test.c
경고가 생성되지 않습니다.
-pedantic
컴파일러가 실제로 C 표준을 준수하게합니다 . 이제 표준에 따라 진단 메시지가 생성됩니다.
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];
^~~~~~~~~~~~~~~
따라서 최대한의 이식성을 위해 표준 개정을 지정하는 것만으로는 충분하지 않습니다. 또한 GCC가 실제로 표준 서한을 준수하도록하기 위해 -pedantic
(또는 -pedantic-errors
)를 사용해야합니다 .
질문의 마지막 부분은 사용에 대한였다 -ansi
와 C ++ . ANSI는 C ++ 언어를 표준화하지 않고 ISO에서만 채택하므로 "프랑스에서 표준화 한 영어"라고 말하는 것만 큼 의미가 있습니다. 그러나 GCC는 여전히 멍청한 것처럼 C ++에서도 그것을 받아들이는 것 같습니다.