source

현재 컴파일러의 표준을 찾는 방법(예: C90 등)

ittop 2023. 7. 6. 22:35
반응형

현재 컴파일러의 표준을 찾는 방법(예: C90 등)

저는 리눅스 기계에서 일하고 있습니다.제가 사용하고 있는 C 컴파일러에 이어 표준을 찾는 시스템 명령어가 있습니까?

이것은 컴파일러에 따라 다릅니다. GCC를 사용하는 것 같습니다.컴파일러 정의 매크로는 다음을 사용하여 확인할 수 있습니다.

gcc -dM -E - < /dev/null

특히 플래그에 대한 설명서를 확인합니다.

###_STDC_VERSION__###

이 매크로는 C Standard 버전 번호로 확장되며, 이는 yyymmL 형식의 긴 정수 상수입니다. 여기서 yyyy와 mm는 Standard 버전의 연도와 월입니다.이것은 컴파일러가 C 표준의 어떤 버전을 준수하는지 나타냅니다.__STDC__와 마찬가지로 GNU CPP가 GCC와 함께 사용되지 않는 한 전체 구현에 대해 반드시 정확한 것은 아닙니다.

값 199409L은 현재 기본값인 1994년 개정된 1989 C 표준을 나타냅니다. 값 199901L은 1999년 개정된 C 표준을 나타냅니다.1999년 개정에 대한 지원은 아직 완료되지 않았습니다.

이 매크로는 -traditional-cpp 옵션을 사용하거나 C++ 또는 Objective-C를 컴파일할 때 정의되지 않습니다.

이 사이트에서 이에 대한 많은 정보를 찾을 수 있습니다.여기 있는 표를 보세요.

코드에서 표준 매크로를 사용하여 이를 테스트할 수도 있습니다. 예를 들어 (원래는 같은 이름의 소스 위조 프로젝트에서):

#if defined(__STDC__)
# define PREDEF_STANDARD_C_1989
# if defined(__STDC_VERSION__)
#  define PREDEF_STANDARD_C_1990
#  if (__STDC_VERSION__ >= 199409L)
#   define PREDEF_STANDARD_C_1994
#  endif
#  if (__STDC_VERSION__ >= 199901L)
#   define PREDEF_STANDARD_C_1999
#  endif
#  if (__STDC_VERSION__ >= 201710L)
#   define PREDEF_STANDARD_C_2018
#  endif
# endif
#endif

명령줄에서 이 옵션을 선택하려면 하나(예: c89)를 선택하고 최소 프로그램에서 반환 값을 확인할 수 있습니다.

echo -e "#ifdef __STDC__\n#error\n#endif"|gcc -xc -c - > /dev/null 2>&1; test $? -eq 0  || echo "c89

컴파일 시 프리프로세서 매크로를 확인합니다.

  • __ANSI__
  • __STDC__
  • __STDC_VERSION__>= 199901L(c99의 경우)

gcc가 있을 수 있으며, 이 경우 컴파일 시 표준을 지정할 수 있습니다.

$ gcc -Wall -std=c89 foo.c -o foo

또는:

$ gcc -Wall -std=c99 foo.c -o foo

유형:

$ man gcc

상세한 것은

명령줄에서 컴파일러가 지원하는 C 버전을 확인하려면 다음을 입력합니다.

gcc -dM -E - < /dev/null | grep "__STDC_"

gcc를 확인할 컴파일러로 대체합니다.

컴파일러가 C89(ANSI C라고도 함) 또는 ISO C90을 지원하는 경우 다음과 같이 표시됩니다.__STDC__표준에 따라 1로 정의됩니다. (그러나 때때로.__STDC__0이 아닌 다른 값으로 설정됩니다.C89는 C90과 동일합니다.C89는 ANSI에 의해 비준되었습니다.1년 후에 ISO는 ANSI 표준을 비준했습니다.ISO 표준은 C90이라고 불립니다.

ISO C90 표준이 개정되었으며 비공식적으로 C95라고 불립니다. (때로는 C94라고도 합니다.)그러나 C95가 더 일반적으로 사용됩니다.ISO는 또한 C99, C11(2011년) 및 C17(2017년)을 비준했습니다.

컴파일러가 C95 이상을 지원하는 경우 다음과 같이 표시됩니다.__STDC_VERSION__.값은 버전에 따라 달라집니다.(예: C99의 경우__STDC_VERSION__199901L)의 값으로 정의됩니다.https://sourceforge.net/p/predef/wiki/Standards/ 을 참조하십시오.

C 프로그램 내의 버전을 확인하려면 다음 코드를 사용하십시오.

#include <stdio.h>
#include <math.h>       // Needed for INFINITY, HUGE_VAL, HUGE_VALF & HUGE_VALL
                        // constants (or macros)
#if !defined(__STDC__)
#   define __STDC__ 0
#endif

#if !defined(__STDC_VERSION__) 
#   define __STDC_VERSION__ 0
#endif


int main()
{
    if (!__STDC__ && !__STDC_VERSION__) printf("The C compiler does not comply with the C89 or later standard!\nIt likely complies with the 1978 K&R C standard (informally known as C78).\n");
    else if (__STDC_VERSION__ >= 201710L) printf("The C compiler complies with the C17 standard.\n");
    else if (__STDC_VERSION__ >= 201112L) printf("The C compiler complies with the C11 standard.\n");
    else if (__STDC_VERSION__ >= 199901L) printf("The C compiler complies with the C99 standard.\n");
    else if (__STDC_VERSION__ >= 199409L) printf("The C compiler complies with the amended C90 standard (also known as C95).\n");
    else if (__STDC__) printf("The C compiler complies with the ANSI C89 / ISO C90 standard.\n");
   
    puts("");
    if (__STDC__) printf("\"__STDC__\": %ld\n", __STDC_VERSION__);
    if (__STDC_VERSION__) printf("\"__STDC_VERSION__\": %ld\n\n", __STDC_VERSION__);
    
    puts("");
    if (__STDC_VERSION__ >= 199901L) printf(" INFINITY (added in C99): %f\n", INFINITY );    // Also works with %lf and %Lf
    if (__STDC_VERSION__ >= 199901L) printf("-INFINITY (added in C99): %f\n", -INFINITY );   // Also works with %lf and %Lf
    
    puts("");
    if (__STDC_VERSION__ >= 199901L) printf(" HUGE_VALF (added in C99): %f\n", HUGE_VALF );
    if (__STDC_VERSION__ >= 199901L) printf("-HUGE_VALF (added in C99): %f\n", -HUGE_VALF );
    
    puts("");
    if (__STDC__) printf(" HUGE_VAL (added in C89 (ANSI) which is the same as C90 (ISO)): %lf\n", HUGE_VAL );
    if (__STDC__) printf("-HUGE_VAL (added in C89 (ANSI) which is the same as C90 (ISO)): %lf\n", -HUGE_VAL );

    puts("");
    if (__STDC_VERSION__ >= 199901L) printf(" HUGE_VALL (added in C99): %Lf\n", HUGE_VALL );
    if (__STDC_VERSION__ >= 199901L) printf("-HUGE_VALL (added in C99): %Lf\n", -HUGE_VALL );

    return 0;
}

다음은 www.onlinegdb.com 의 C 컴파일러를 사용한 이 프로그램의 출력입니다.

The C compiler complies with the C99 standard.

"__STDC__": 199901
"__STDC_VERSION__": 199901


 INFINITY (added in C99): inf
-INFINITY (added in C99): -inf

 HUGE_VALF (added in C99): inf
-HUGE_VALF (added in C99): -inf

 HUGE_VAL (added in C89 (ANSI) which is the same as C90 (ISO)): inf
-HUGE_VAL (added in C89 (ANSI) which is the same as C90 (ISO)): -inf

 HUGE_VALL (added in C99): inf
-HUGE_VALL (added in C99): -inf

만약 당신의 C 컴파일러가 gcc라면, 당신은 다음을 사용할 수 있습니다.-stdC 표준을 따를 C 표준을 지정하는 옵션입니다.기본값은 gnu89입니다.특정 컴파일러의 표준을 결정하는 일반적인 시스템 명령은 없습니다.설명서를 확인해야 합니다.

는 타란툴라의합니다 - 과 gcc에 의해 - c89그 c90동일한표가 없기 때문입니다.__STDC_VERSION__확정된

그래서 아마 다음과 같은 것이 있을 것입니다.

#if defined(__STDC__)
#  if defined(__STDC_VERSION__)
#    if (__STDC_VERSION__ >= 201710L)
#      define C_LANGUAGE_STANDARD 2018
#    elif (__STDC_VERSION__ >= 201112L)
#      define C_LANGUAGE_STANDARD 2011
#    elif (__STDC_VERSION__ >= 199901L)
#      define C_LANGUAGE_STANDARD 1999
#    elif (__STDC_VERSION__ >= 199409L)
#      define C_LANGUAGE_STANDARD 1995
#    endif
#  else
#      define C_LANGUAGE_STANDARD 1990
#  endif
#else
#      define C_LANGUAGE_STANDARD 1972
#endif

그게 더 어울릴까요?

언급URL : https://stackoverflow.com/questions/4991707/how-to-find-my-current-compilers-standard-like-if-it-is-c90-etc

반응형