현재 컴파일러의 표준을 찾는 방법(예: 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라면, 당신은 다음을 사용할 수 있습니다.-std
C 표준을 따를 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
'source' 카테고리의 다른 글
CUBE와 ROLLUP의 차이점 이해 (0) | 2023.07.06 |
---|---|
하위 쿼리 결과에서 MAX()를 사용하는 방법은 무엇입니까? (0) | 2023.07.06 |
Android용 FireBase가 "앱을 실행하여 설치를 확인"하지 않음 (0) | 2023.07.06 |
MongoDB 잘못된 문서: 개체를 인코딩할 수 없습니다. (0) | 2023.07.06 |
PL/SQL에 대한 단위 테스트 (0) | 2023.07.06 |