programing

무엇 현재 GCC(우분투 특히)의 기본 C-std 표준 버전일까요?

bestcode 2022. 8. 19. 20:50
반응형

무엇 현재 GCC(우분투 특히)의 기본 C-std 표준 버전일까요?

내가 cc의 현재 버전으로 보게 물으면 이것을 받으면.

$ cc --version
cc (Ubuntu/Linaro 4.7.2-2ubuntu1) 4.7.2
Copyright (C) 2012 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

$ 

나는 알고 싶는 c89, c90, c99 또는 c11의 사용되고 있다.

매뉴얼에서 .gcc가되어 있는 gcc 매뉴얼을 info gcc또는 온라인 여기.그4.7.2 요람의 관련 부분 여기 있다.

ANSI/ISO C의 gcc이다.는, 「이러다」에 합니다.-std=gnu90GNU-specific 확장명을 가지고 있는 1989/1990 표준입니다.(어떤 진단이 언어 표준에 필요한 발행하지 않다.). 버전 5.15.1.0, 2015-04-22'에서 되었습니다.-std=gnu90로로 합니다.-std=gnu11, 여기에 문서화.

만약 당신이 표준 적합성을 갖고 싶다면:다음 각 호의 어느 하나를 사용할 수 있다.

-std=c90 -pedantic
-std=c99 -pedantic
-std=c11 -pedantic

-std=c90에는 「 」를 할 도 있습니다.-ansi,-std=c89 , 「」-std=iso9899:1990.

-std=iso9899:199409그 C90 표준+(모든 것은 또한 99에 있)몇가지 사소한 기능 추가한 1995년 개정을 지원합니다.

-std=c99에는 「 」를 할 도 있습니다.-std=c9x ★★★★★★★★★★★★★★★★★」-std=iso9899:1999은 「 「 」 )c9x표준이 공표되기 전에 사용되었습니다.)C99 지원은 완전하지는 않지만 거의 완벽합니다.

-std=c11 can 、 「 」의 철자도 할 수 있습니다.-std=c0x ★★★★★★★★★★★★★★★★★」-std=iso9899:2011(명칭))c0x최종 표준이 발표되기 전에 사용되었습니다; 그것은 잘못 추정되었습니다.x9)를 넘지 않습니다.C11 지원도 불완전합니다.현황은 여기에 요약되어 있습니다.

-pedantic옵션을 지정하면 gcc는 제약조건 및 구문규칙 위반에 대해 필요한 진단을 출력합니다.경우에 따라서는 이러한 진단은 단순한 경고일 수 있습니다.또, 이러한 경고와 언어로 요구되지 않는 다른 경고를 구별하는 쉬운 방법이 없습니다.-pedantic타타에 -pedantic-errors가 언어 오류로 .gcc는 언어 위반을 치명적인 오류로 간주합니다.

표준의 간단한 이력:

  • C89는 1989년 ANSI에 의해 발표된 최초의 공식 C 표준이다.
  • C90은 표준의 ISO 버전으로, C89와 정확히 같은 언어를 기술하고 있습니다.ANSI는 ISO 버전의 표준을 공식적으로 채택했다.몇 가지 오류를 수정하는 기술 코리겐다가 두 개 있었습니다.
  • C95는 C90의 수정판으로, 주로 이중 글자와 폭넓은 문자 지원 등 몇 가지 기능을 추가했습니다.제가 알기로는 병합 버전은 출판된 적이 없습니다.
  • C99는 1999년에 ISO에 의해 발행되었다.테크니컬 코리젠다 3개가 있었다.
  • C11 2011년 2011 에 ISO 。, 이 기술 코리겐덤의 있습니다.__STDC_VERSION__ ★★★★★★★★★★★★★★★★★」__STDC_LIB_EXT1__.

ANSI는 자체 버전의 1999년 또는 2011년 표준을 발행하지 않고 대신 ISO 표준을 채택했습니다.

N1256은 3개의 Technical Corrigenda가 통합된 C99 표준의 초안입니다.

N1570은 C11 규격의 무료 초안입니다.공개된 C11 표준과 기술표준 1개 사이에는 약간의 차이가 있습니다.자세한 내용은 이 질문에 대한 답변참조하십시오.

info gccgcc6의 경우 및 gcc5의 경우 https://gcc.gnu.org/onlinedocs/gcc-5.4.0/gcc/Standards.html#Standards의 경우

version gcc g g6.3.1-10.1.0

2.1 C Language
==============
 The default, if no C language dialect options are given, is
'-std=gnu11'.

2.2 C++ Language
================
 The default, if no C++ language dialect options are given, is
'-std=gnu++14'.

version gcc g g5.4.0

2.1 C Language
==============
The default, if no C language dialect options are given, is -std=gnu11

2.2 C++ Language
================
The default, if no C++ language dialect options are given, is -std=gnu++98

C의 경우 디폴트모드는 그대로입니다std=gnu11, C++의 경우 에서 점프합니다.std=gnu++98로로 합니다.std=gnu++14

최소 테스트 프로그램

매뉴얼을 읽지 않고 경험적으로 알아내고 싶다면요?

c.c

#include <stdio.h>

int main(void) {
#ifdef __STDC_VERSION__
    printf("__STDC_VERSION__ = %ld \n", __STDC_VERSION__);
#endif
#ifdef __STRICT_ANSI__
    puts("__STRICT_ANSI__");
#endif
    return 0;
}

테스트 대상:

#!/usr/bin/env bash
for std in c89 c99 c11 c17 gnu89 gnu99 gnu11 gnu17; do
  echo $std
  gcc -std=$std -o c.out c.c
  ./c.out
  echo
done
echo default
gcc -o c.out c.c
./c.out

결과:

c89
__STRICT_ANSI__

c99
__STDC_VERSION__ = 199901
__STRICT_ANSI__

c11
__STDC_VERSION__ = 201112
__STRICT_ANSI__

c17
__STDC_VERSION__ = 201710
__STRICT_ANSI__

gnu89

gnu99
__STDC_VERSION__ = 199901

gnu11
__STDC_VERSION__ = 201112

gnu17
__STDC_VERSION__ = 201710

default
__STDC_VERSION__ = 201710

: 론 :gnu17로 사용됩니다.

  • __STRICT_ANSI__: 에 : GCC-std=c을 위해서가 아니다-std=gnu, 를 참조해 주세요.https://gcc.gnu.org/onlinedocs/cpp/Common-Predefined-Macros.html
  • __STDC_VERSION__: C99+ : : : 、 C99 +ANSI C ansi ansi 。표준에서 아직 정의되지 않은 C89에는 존재하지 않는다.

-std=gnu* »-std=c*참고 항목:-std=c++11과 -std=param++11의 차이점은 무엇입니까?

C++

main.cpp

#include <iostream>

int main(void) {
#ifdef __cplusplus
    std::cout << __cplusplus << std::endl;
#endif
#ifdef __STRICT_ANSI__
    std::cout << "__STRICT_ANSI__" << std::endl;
#endif
    return 0;
}

테스트 대상:

#!/usr/bin/env bash
for std in c++98 c++11 c++14 c++17 gnu++98 gnu++11 gnu++14 gnu++17; do
  echo $std
  g++ -std=$std -o cpp.out cpp.cpp
  ./cpp.out
  echo
done
echo default
g++ -o cpp.out cpp.cpp
./cpp.out

결과:

c++98
199711
__STRICT_ANSI__

c++11
201103
__STRICT_ANSI__

c++14
201402
__STRICT_ANSI__

c++17
201703
__STRICT_ANSI__

gnu++98
199711

gnu++11
201103

gnu++14
201402

gnu++17
201703

default
201402

: 론 :gnu++14츠키다

  • __cplusplus: 한 C에 의해 C++98 C++는 C++입니다.

Ubuntu 18.10, GCC 8.2.0, GitHub 업스트림에서 테스트 완료.

첫 번째 행에는 GCC 버전(4.7.2)이 표시됩니다.

(Ubuntu/Linaro 4.7.2-2ubuntu1) 4.7.2

할 때 사용할할 수 C/C++ 리비전을 사용할 수 있습니다.-std=c99 ★★★★★★★★★★★★★★★★★」-std=c99

: ★gnu89을 사용하다

해야 할 의 최신 수 입니다.은 유무에 해당됩니다.-pedantic

gcc -std=c89 -pedanticC99 코드 구조를 사용하여 컴파일을 시도할 경우 오류 또는 경고를 표시합니다.어떤 경우에는 그럴 것이고 어떤 경우에는 그렇지 않을 것이다.를 들어, 이 에서는, 이 코드에서는, 「이 」를 컴파일 합니다.%zu포맷 지정자는 C99까지 추가되지 않았는데도 printf() 호출로 지정됩니다.

기본 gcc 명령어는 ISO C90(일부 C99 기능 포함)의 GNU 방언입니다.이것은 C 코드의 디폴트입니다.

언급URL : https://stackoverflow.com/questions/14737104/what-is-the-default-c-std-standard-version-for-the-current-gcc-especially-on-u

반응형