programing

GCC/G++ 컴파일러에서 pedantic을 사용하는 목적은 무엇입니까?

copysource 2022. 8. 9. 23:47
반응형

GCC/G++ 컴파일러에서 pedantic을 사용하는 목적은 무엇입니까?

메모는 다음과 같습니다.

-ansi: 컴파일러에 ANSI 언어 옵션을 구현하도록 지시합니다.이것에 의해, ANSI 규격과 호환되지 않는 GCC의 특정의 「기능」이 오프됩니다.

-pedantic: 와 조합하여 사용-ansi이 명령어는 컴파일러가 ANSI 표준을 엄격하게 준수하고 비준수 코드를 모두 거부하도록 지시합니다.

가장 중요한 것:

  • 의 목적은 무엇입니까?-pedantic그리고.-ansiGCC/G++ 컴파일러 옵션(위 설명을 이해하지 못했습니다)
  • 이 두 가지 옵션을 사용할 수 있는 적절한 상황은 무엇입니까?
  • 언제 사용하면 좋을까요?
  • 그들은 중요합니까?

코딩할 때 항상 사용해요

-ansiflag는 와 동등합니다.-std=c89전술한 바와 같이 GCC의 일부 확장기능은 꺼집니다.추가 중-pedantic는 더 많은 확장을 끄고 더 많은 경고를 생성합니다.예를 들어 509자를 넘는 문자열 리터럴이 있는 경우-pedanticC89 규격에서 요구되는 최소 한도를 초과하기 때문에 경고합니다.즉, 모든 C89 컴파일러는 길이가 509인 스트링을 받아들일 필요가 있습니다.단, 보다 긴 스트링을 사용할 수 있는 것은 아닙니다.단, 보다 긴 스트링을 사용할 수 있는 것은 컴파일러가 허가되어 있기 때문에 현학적인 경고가 없으면 GCC도 이를 받아들일 수 없습니다.

가능한 경우 GCC 컴파일러는 항상 프로그램 컴파일을 시도합니다.단, 경우에 따라서는 C 및 C++ 규격에 따라서는 특정 내선번호가 금지되어 있습니다.GCC나 g++ 등의 컴파일러에 준거한 경우 이러한 확장이 발생했을 때 진단 프로그램을 발행해야 합니다.

예를 들어, GCC 컴파일러의 -pedantic 옵션을 지정하면 이러한 경우 GCC에서 경고가 발생합니다.보다 엄격한 -pedantic-errors 옵션을 사용하면 이러한 진단 경고가 이러한 시점에서 컴파일 실패의 원인이 되는 오류로 변환됩니다.적합한 컴파일러에 의해 플래그가 지정되어야 하는 비ISO 구성 요소만 경고 또는 오류를 생성합니다.

< >-ansi는 ANSI 표준 X3.159-1989 "Programming Language C"의 브랜드 변경인 ISO/IEC 9899:199030년오래된 리비전에 따라 컴파일러에 컴파일을 요구하는 오래된 스위치입니다.왜 쓸모없을까?C90이 ISO에 의해 발행된 이후 ISO가 C 표준화를 담당해 왔으며, C90에 대한 기술적 수정은 ISO에 의해 표준화되었습니다.이 때문에, 보다 많은 경우-std=c90.

이 스위치가 없으면 최신 GCC C 컴파일러는 ISO/IEC 9899:2011에서 표준화된 C 언어 또는 최신 2018 리비전에 준거합니다.

유감스럽게도 일부 게으른 컴파일러 벤더는 표준화 문서가 표준 기관으로부터도 입수할 수 없는 오래된 표준 리비전을 고수하는 것이 허용된다고 믿고 있습니다.

스위치를 사용하면 코드가 이러한 오래된 컴파일러로 컴파일되는 것을 확인할 수 있습니다.


-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이 지정되어 있습니다.

전처리 번역 유닛 또는 번역 유닛이 구문 규칙 또는 제약의 위반을 포함하고 있는 경우, 동작이 정의되지 않았거나 구현 정의되었다고 명시되어 있는 경우에도 적합 실장은 적어도 1개의 진단 메시지(실장 정의 방식으로 식별됨)를 생성해야 한다.다른 상황에서는 진단 메시지를 생성할 필요가 없습니다.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];
         ^~~~~~~~~~~~~~~

따라서 휴대성을 최대화하기 위해 표준 리비전을 지정하는 것만으로는 충분하지 않습니다.-pedantic(또는-pedantic-errors)는 GCC가 실제로 표준의 문자에 준거하고 있는 것을 확인합니다.


질문의 마지막 부분은 '사용법'에 대한 내용입니다.-ansiC++사용합니다.ANSI는 C++ 언어를 표준화한 적이 없습니다.ISO에서 채택했을 뿐이기 때문에, 이것은 「프랑스에 의해서 표준화된 영어」라고 하는 것과 거의 같은 의미가 있습니다.하지만 GCC는 여전히 C++를 위해 그것을 받아들이는 것처럼 보인다.

코드를 이식할 필요가 있는 경우는, GCC 확장자나 그 외의 비표준 기능을 사용하지 않고 컴파일 하는 것을 테스트할 수 있습니다.코드 컴파일이 다음과 같은 경우-pedantic -ansi그러면 이론적으로는 다른 ANSI 표준 컴파일러와 함께 정상적으로 컴파일해야 합니다.

다양한 플랫폼에서 컴파일러와 함께 컴파일될 것으로 예상되는 코드를 작성하는 경우 이러한 플래그를 직접 사용하면 GCC에서 컴파일만 하는 코드를 생성할 수 없습니다.

다른 사람들은 충분히 대답했습니다.빈번한 내선번호의 몇 가지 예를 추가하겠습니다.

mainvoid이것은 표준으로 정의되어 있지 않습니다.즉, 일부 컴파일러(GCC 포함)에서만 동작하며 다른 컴파일러에서는 동작하지 않습니다. 나나나 by.int main() ★★★★★★★★★★★★★★★★★」int main(int, char**)는 표준으로 정의되어 있는2개의 시그니처입니다.

또 다른 일반적인 확장 기능은 다른 함수 내에서 함수를 선언하고 정의할 수 있다는 것입니다.

void f()
{
    void g()
    {
       // ...
    }

    // ...
    g();
    // ...
}

이건 비표준입니다.이런 행동을 원한다면 C++11 람다를 체크하세요.

기본적으로 ANSI 표준을 구현한 다른 컴파일러 및 사용하는 라이브러리/API 호출에 주의를 기울이면 다른 운영 체제/플랫폼에서 코드를 컴파일하기가 훨씬 쉬워집니다.

첫 번째는 GCC(-ansi)의 특정 기능을 끕니다.

두 번째는 표준을 준수하지 않는 모든 에 대해 불평합니다(GCC의 특정 기능뿐만 아니라 구성 요소도 마찬가지입니다). (-pedantic)

Pedantic은 GCC 컴파일러가 ANSI 호환성을 갖게 하는 확장뿐만 아니라 모든 GNU C 확장을 거부하도록 합니다.

언급URL : https://stackoverflow.com/questions/2855121/what-is-the-purpose-of-using-pedantic-in-the-gcc-g-compiler

반응형