C 전처리 기가 왜“linux”라는 단어를 상수“1”로 해석합니까?


1022

GCCC 전처리 기가 왜 단어 (소문자)를 상수로 해석 합니까?linux1

test.c :

#include <stdio.h>
int main(void)
{       
    int linux = 5;
    return 0;
}

결과 $ gcc -E test.c(전처리 단계 후 중지) :

....
int main(void)
{
    int 1 = 5;
    return 0;
}

물론 오류가 발생합니다.

(BTW : 전혀 없습니다 #define linuxstdio.h파일.)


52
당신은이 질문 / 문제는 이미 지금 쯤 올 것 같아
Letseatlunch


14
시도 #undef linux했거나 다른 변수를 사용 했습니까? linux크로스 플랫폼 응용 프로그램을 설계하고 사용할 API (Windows, mac, linux, BSD 등)를 정확하게 알아야하는 경우와 같이 상수 는 운영 체제를 테스트하는 데 사용됩니다. stdio.h에 없지만 커널이 Linux 인 경우 여전히 정의됩니다. 동일한 코드는 Windows에서 오류를 발생시키지 않지만 Windows 또는 WINDOWS와 같은 변수를 변수로 사용하거나 그 반대의 경우도 마찬가지입니다.
Braden Best

궁금한 점 : 컴파일에 명령 줄 매개 변수 -Ulinux를 추가하면 어떻게됩니까?
dhein

1
@BradenBest _WIN32 및 유사한 매트릭스.
Paul Stelian

답변:


955

예전과 같은 문자 사전 정의 (-ANSI 사전) unixvax코드가 컴파일되고 있던 어떤 시스템 컴파일시에 감지 할 수있는 방법이었다. 당시에는 공식 언어 표준이 없었으며 (K & R의 첫 번째 판 뒤에있는 참조 자료를 넘어서), 복잡한 C 코드는 일반적으로 #ifdef시스템 간의 차이를 허용 하는 복잡한 미로였습니다 . 이러한 매크로 정의는 일반적으로 라이브러리 헤더 파일에 정의되지 않은 컴파일러 자체에 의해 설정됩니다. 구현에서 사용할 수있는 식별자와 프로그래머를 위해 예약 된 식별자에 대한 실제 규칙이 없었기 때문에 컴파일러 작성자는 간단한 이름을 자유롭게 사용 unix하고 프로그래머가 자신의 목적으로 해당 이름을 사용하지 않는 것으로 가정했습니다.

1989 ANSI C 표준은 구현이 법적으로 사전 정의 할 수있는 기호를 제한하는 규칙을 도입했습니다. 컴파일러에 의해 미리 정의 된 매크로는 이름이 두 개의 밑줄로 시작하거나 밑줄과 대문자로 시작하므로 프로그래머는 해당 패턴과 일치하지 않고 표준 라이브러리에서 사용되지 않는 식별자를 자유롭게 사용할 수 있습니다.

결과적으로, 사전 정의 unix되거나 linux부적합한 컴파일러 는와 같은 것을 사용하는 완벽하게 유효한 코드를 컴파일하지 못하기 때문에 int linux = 5;.

이와 같이 gcc는 기본적으로 부적합하지만 올바른 명령 행 옵션을 사용하여 (합리적으로 잘) 만들 수 있습니다.

gcc -std=c90 -pedantic ... # or -std=c89 or -ansi
gcc -std=c99 -pedantic
gcc -std=c11 -pedantic

자세한 내용 은 gcc 설명서 를 참조하십시오.

gcc는 다음 릴리스에서 이러한 정의를 단계적으로 폐지 할 것이므로이 정의에 의존하는 코드를 작성해서는 안됩니다. 프로그램이 Linux 대상 용으로 컴파일되는지 여부를 알아야하는 경우 __linux__gcc 또는 호환되는 컴파일러를 사용한다고 가정하여 정의되어 있는지 확인할 수 있습니다 . 자세한 내용 은 GNU C 전 처리기 설명서 를 참조하십시오.

David Korn (예, Korn Shell의 저자)이 1987 년 국제 난독 화 C 코드 경연 대회 에서 "최고의 라이너"를 획득 한 경우 미리 정의 된 unix매크로를 활용했습니다 .

main() { printf(&unix["\021%six\012\0"],(unix)["have"]+"fun"-0x60);}

"unix"매크로 이름의 철자와는 전혀 관련이없는 이유로 인쇄합니다 .


32
@Sebastian : 여기에 스포일러를 게시하고 싶지 않으며,이 코드를 읽는 사람은 먼저 코드를 이해하려고합니다. 그러나 정말로 포기하고 싶다면 설명을 게시했습니다. gist.github.com/Keith-S-Thompson/6920347
Keith Thompson

10
@robbie_c가 언급 한 힌트는 여기로 옮겨졌습니다 : ioccc.org/1987/korn/hint.html
Ingo Blechschmidt

7
"구시대 (ANSI 이전)에서와 같은 사전 정의 기호 unixvax"-응? 나는 옛날에 모든 세계가 ~이라는 것을 이해했습니다 vax!
sqweek

6
나는 부활절 달걀이라고 생각했지만 공룡으로 밝혀졌습니다.
Rolf

2
@KeithThompson 해당 스 니펫에는 실제로 정의되지 않은 동작이 있습니다 ( unix정의 와는 관련이 없음 ). 나는 당신이나 다른 사람이 궁금하다면 그 요점에 대한 논평에서 왜 설명했는지 설명했습니다.
Joseph Sible-Reinstate Monica

184

이것은 ( 언급 되지 않은) "GNU 확장명"인 것 같습니다 : [ 수정 : 나는 문서에서 마지막으로 언급을 찾았습니다. 아래를 참조하십시오.]

다음 명령은이 -dM옵션을 사용하여 모든 전 처리기 정의를 인쇄합니다. 입력 "file"이 비어 있으므로 미리 정의 된 매크로가 정확하게 표시됩니다. 표준 우분투 설치에서 gcc-4.7.3으로 실행되었습니다. 전처리 기가 표준을 인식한다는 것을 알 수 있습니다. 전체적으로 243 개의 매크로와 -std=gnu99240 개의 -std=c99; 관련성을 위해 출력을 필터링했습니다.

$ cpp --std=c89 -dM < /dev/null | grep linux
#define __linux 1
#define __linux__ 1
#define __gnu_linux__ 1

$ cpp --std=gnu89 -dM < /dev/null | grep linux
#define __linux 1
#define __linux__ 1
#define __gnu_linux__ 1
#define linux 1

$ cpp --std=c99 -dM < /dev/null | grep linux
#define __linux 1
#define __linux__ 1
#define __gnu_linux__ 1

$ cpp --std=gnu99 -dM < /dev/null | grep linux
#define __linux 1
#define __linux__ 1
#define __gnu_linux__ 1
#define linux 1

"gnu 표준"버전도 있습니다 #define unix. 사용 c11하고 gnu11동일한 결과를 생성합니다.

나는 그 이유가 있다고 생각하지만 gcc ( -std=gnu89다른 언급 이 없는 한 C 코드를 컴파일하는)의 기본 설치를 부적합하게 만들고이 질문에서와 같이 놀랍게 만드는 것 같습니다 . 이름이 밑줄로 시작하지 않는 매크로로 글로벌 네임 스페이스를 오염시키는 것은 적합한 구현에서 허용되지 않습니다. (6.8.10p2 : "다른 사전 정의 된 매크로 이름은 선행 밑줄로 시작하고 대문자 또는 두 번째 밑줄로 시작해야합니다."부록 J.5 (이동성 문제)에 언급 된대로 이러한 이름은 종종 사전 정의됩니다.

원래이 답변을 썼을 때 gcc 에서이 문제에 대한 문서를 찾을 수 없었지만 C 구현 정의 동작 이나 C 확장이 아니라 cpp수동 섹션 3.7.3 에서 마지막으로 발견했습니다 . 참고 사항 :

예약 된 네임 스페이스 외부에있는 사전 정의 된 모든 매크로를 천천히 단계적으로 폐지하고 있습니다. 새로운 프로그램에서 사용해서는 안됩니다…


57
gnu89 또는 gnu99에 대한 GCC 컴파일은 C 표준의 구현이 아니기 때문에 C 표준을 위반하지 않으며 C 표준은 구현되지 않은 것에 대한 요구 사항을 부과하지 않습니다.
Eric Postpischil

17
@EricPostpischil : 확실히 맞습니다. 단순히 부적합한 구현입니다. 그러나 gcc 의 기본 설정 은 -std = c89 이므로 gcc는 기본적으로 적합하지 않습니다. 물론 불법은 아니지만 gnu89, gnu99, gnu11 확장의 진행 과정에서 gcc가 네임 스페이스 오염을 줄이거 나 어딘가에 문서화 할 것으로 예상 할 수 있습니다.
rici

1
@EricPostpischil : 그래, gnu cpp 문서에서 일부 문서를 찾았는데, 여기에는 "우리는 예약 된 네임 스페이스 외부에있는 미리 정의 된 매크로를 모두 단계적으로 폐지하고 있습니다. 새 프로그램에서는 절대 사용해서는 안됩니다. 찾을 때마다 병렬 매크로를 사용하는 오래된 코드입니다. " 점심 식사 후 포인터로 답변을 편집하겠습니다.
rici

5
@EricPostpischil : 당신이 맞아요. 나는 그것을 잘못 입력했다. 나는 -std=gnu89이것이 기본값이며, 내가 아는 한 solaris, linux 및 mac os x ( developer.apple.com/library/mac/documentation/Darwin/Reference/… )의 기본값이며 , 네임 스페이스를 오염시키는 것 c89표준을 준수하려고 시도하기 때문에 표준이 아닌 경우 불만이 없습니다.
rici

6
@ChrisDodd : 좋은 생각인지 아닌지는 의견이 없습니다. 나는 표준과의 편차가 문서에서 쉽게 찾을 수 있다고 확신합니다.
rici

67

linux컴파일러가 Linux에서 실행 중이거나 컴파일 할 때 (크로스 컴파일러 인 경우) 내장 매크로가 정의되어 있기 때문입니다.

사전 정의 된 매크로가 많이 있습니다. GCC를 사용하면 다음을 사용할 수 있습니다.

cp /dev/null emptyfile.c
gcc -E -dM emptyfile.c

매크로 목록을 얻습니다. (GCC를 /dev/null직접 수락하도록 설득 하지는 못했지만 빈 파일은 제대로 작동하는 것 같습니다.) Mac OS X 10.8.5에서 GCC 4.8.1을 실행하면 다음과 같은 결과가 나타납니다.

#define __DBL_MIN_EXP__ (-1021)
#define __UINT_LEAST16_MAX__ 65535
#define __ATOMIC_ACQUIRE 2
#define __FLT_MIN__ 1.17549435082228750797e-38F
#define __UINT_LEAST8_TYPE__ unsigned char
#define __INTMAX_C(c) c ## L
#define __CHAR_BIT__ 8
#define __UINT8_MAX__ 255
#define __WINT_MAX__ 2147483647
#define __ORDER_LITTLE_ENDIAN__ 1234
#define __SIZE_MAX__ 18446744073709551615UL
#define __WCHAR_MAX__ 2147483647
#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_1 1
#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_2 1
#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_4 1
#define __DBL_DENORM_MIN__ ((double)4.94065645841246544177e-324L)
#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_8 1
#define __GCC_ATOMIC_CHAR_LOCK_FREE 2
#define __FLT_EVAL_METHOD__ 0
#define __GCC_ATOMIC_CHAR32_T_LOCK_FREE 2
#define __x86_64 1
#define __UINT_FAST64_MAX__ 18446744073709551615ULL
#define __SIG_ATOMIC_TYPE__ int
#define __DBL_MIN_10_EXP__ (-307)
#define __FINITE_MATH_ONLY__ 0
#define __GNUC_PATCHLEVEL__ 1
#define __UINT_FAST8_MAX__ 255
#define __DEC64_MAX_EXP__ 385
#define __INT8_C(c) c
#define __UINT_LEAST64_MAX__ 18446744073709551615ULL
#define __SHRT_MAX__ 32767
#define __LDBL_MAX__ 1.18973149535723176502e+4932L
#define __UINT_LEAST8_MAX__ 255
#define __GCC_ATOMIC_BOOL_LOCK_FREE 2
#define __APPLE_CC__ 1
#define __UINTMAX_TYPE__ long unsigned int
#define __DEC32_EPSILON__ 1E-6DF
#define __UINT32_MAX__ 4294967295U
#define __LDBL_MAX_EXP__ 16384
#define __WINT_MIN__ (-__WINT_MAX__ - 1)
#define __SCHAR_MAX__ 127
#define __WCHAR_MIN__ (-__WCHAR_MAX__ - 1)
#define __INT64_C(c) c ## LL
#define __DBL_DIG__ 15
#define __GCC_ATOMIC_POINTER_LOCK_FREE 2
#define __SIZEOF_INT__ 4
#define __SIZEOF_POINTER__ 8
#define __USER_LABEL_PREFIX__ _
#define __STDC_HOSTED__ 1
#define __LDBL_HAS_INFINITY__ 1
#define __FLT_EPSILON__ 1.19209289550781250000e-7F
#define __LDBL_MIN__ 3.36210314311209350626e-4932L
#define __DEC32_MAX__ 9.999999E96DF
#define __strong 
#define __INT32_MAX__ 2147483647
#define __SIZEOF_LONG__ 8
#define __APPLE__ 1
#define __UINT16_C(c) c
#define __DECIMAL_DIG__ 21
#define __LDBL_HAS_QUIET_NAN__ 1
#define __DYNAMIC__ 1
#define __GNUC__ 4
#define __MMX__ 1
#define __FLT_HAS_DENORM__ 1
#define __SIZEOF_LONG_DOUBLE__ 16
#define __BIGGEST_ALIGNMENT__ 16
#define __DBL_MAX__ ((double)1.79769313486231570815e+308L)
#define __INT_FAST32_MAX__ 2147483647
#define __DBL_HAS_INFINITY__ 1
#define __DEC32_MIN_EXP__ (-94)
#define __INT_FAST16_TYPE__ short int
#define __LDBL_HAS_DENORM__ 1
#define __DEC128_MAX__ 9.999999999999999999999999999999999E6144DL
#define __INT_LEAST32_MAX__ 2147483647
#define __DEC32_MIN__ 1E-95DF
#define __weak 
#define __DBL_MAX_EXP__ 1024
#define __DEC128_EPSILON__ 1E-33DL
#define __SSE2_MATH__ 1
#define __ATOMIC_HLE_RELEASE 131072
#define __PTRDIFF_MAX__ 9223372036854775807L
#define __amd64 1
#define __tune_core2__ 1
#define __ATOMIC_HLE_ACQUIRE 65536
#define __LONG_LONG_MAX__ 9223372036854775807LL
#define __SIZEOF_SIZE_T__ 8
#define __SIZEOF_WINT_T__ 4
#define __GXX_ABI_VERSION 1002
#define __FLT_MIN_EXP__ (-125)
#define __INT_FAST64_TYPE__ long long int
#define __DBL_MIN__ ((double)2.22507385850720138309e-308L)
#define __LP64__ 1
#define __DEC128_MIN__ 1E-6143DL
#define __REGISTER_PREFIX__ 
#define __UINT16_MAX__ 65535
#define __DBL_HAS_DENORM__ 1
#define __UINT8_TYPE__ unsigned char
#define __NO_INLINE__ 1
#define __FLT_MANT_DIG__ 24
#define __VERSION__ "4.8.1"
#define __UINT64_C(c) c ## ULL
#define __GCC_ATOMIC_INT_LOCK_FREE 2
#define __FLOAT_WORD_ORDER__ __ORDER_LITTLE_ENDIAN__
#define __INT32_C(c) c
#define __DEC64_EPSILON__ 1E-15DD
#define __ORDER_PDP_ENDIAN__ 3412
#define __DEC128_MIN_EXP__ (-6142)
#define __INT_FAST32_TYPE__ int
#define __UINT_LEAST16_TYPE__ short unsigned int
#define __INT16_MAX__ 32767
#define __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ 1080
#define __SIZE_TYPE__ long unsigned int
#define __UINT64_MAX__ 18446744073709551615ULL
#define __INT8_TYPE__ signed char
#define __FLT_RADIX__ 2
#define __INT_LEAST16_TYPE__ short int
#define __LDBL_EPSILON__ 1.08420217248550443401e-19L
#define __UINTMAX_C(c) c ## UL
#define __SSE_MATH__ 1
#define __k8 1
#define __SIG_ATOMIC_MAX__ 2147483647
#define __GCC_ATOMIC_WCHAR_T_LOCK_FREE 2
#define __SIZEOF_PTRDIFF_T__ 8
#define __x86_64__ 1
#define __DEC32_SUBNORMAL_MIN__ 0.000001E-95DF
#define __INT_FAST16_MAX__ 32767
#define __UINT_FAST32_MAX__ 4294967295U
#define __UINT_LEAST64_TYPE__ long long unsigned int
#define __FLT_HAS_QUIET_NAN__ 1
#define __FLT_MAX_10_EXP__ 38
#define __LONG_MAX__ 9223372036854775807L
#define __DEC128_SUBNORMAL_MIN__ 0.000000000000000000000000000000001E-6143DL
#define __FLT_HAS_INFINITY__ 1
#define __UINT_FAST16_TYPE__ short unsigned int
#define __DEC64_MAX__ 9.999999999999999E384DD
#define __CHAR16_TYPE__ short unsigned int
#define __PRAGMA_REDEFINE_EXTNAME 1
#define __INT_LEAST16_MAX__ 32767
#define __DEC64_MANT_DIG__ 16
#define __INT64_MAX__ 9223372036854775807LL
#define __UINT_LEAST32_MAX__ 4294967295U
#define __GCC_ATOMIC_LONG_LOCK_FREE 2
#define __INT_LEAST64_TYPE__ long long int
#define __INT16_TYPE__ short int
#define __INT_LEAST8_TYPE__ signed char
#define __DEC32_MAX_EXP__ 97
#define __INT_FAST8_MAX__ 127
#define __INTPTR_MAX__ 9223372036854775807L
#define __LITTLE_ENDIAN__ 1
#define __SSE2__ 1
#define __LDBL_MANT_DIG__ 64
#define __CONSTANT_CFSTRINGS__ 1
#define __DBL_HAS_QUIET_NAN__ 1
#define __SIG_ATOMIC_MIN__ (-__SIG_ATOMIC_MAX__ - 1)
#define __code_model_small__ 1
#define __k8__ 1
#define __INTPTR_TYPE__ long int
#define __UINT16_TYPE__ short unsigned int
#define __WCHAR_TYPE__ int
#define __SIZEOF_FLOAT__ 4
#define __pic__ 2
#define __UINTPTR_MAX__ 18446744073709551615UL
#define __DEC64_MIN_EXP__ (-382)
#define __INT_FAST64_MAX__ 9223372036854775807LL
#define __GCC_ATOMIC_TEST_AND_SET_TRUEVAL 1
#define __FLT_DIG__ 6
#define __UINT_FAST64_TYPE__ long long unsigned int
#define __INT_MAX__ 2147483647
#define __MACH__ 1
#define __amd64__ 1
#define __INT64_TYPE__ long long int
#define __FLT_MAX_EXP__ 128
#define __ORDER_BIG_ENDIAN__ 4321
#define __DBL_MANT_DIG__ 53
#define __INT_LEAST64_MAX__ 9223372036854775807LL
#define __GCC_ATOMIC_CHAR16_T_LOCK_FREE 2
#define __DEC64_MIN__ 1E-383DD
#define __WINT_TYPE__ int
#define __UINT_LEAST32_TYPE__ unsigned int
#define __SIZEOF_SHORT__ 2
#define __SSE__ 1
#define __LDBL_MIN_EXP__ (-16381)
#define __INT_LEAST8_MAX__ 127
#define __SIZEOF_INT128__ 16
#define __LDBL_MAX_10_EXP__ 4932
#define __ATOMIC_RELAXED 0
#define __DBL_EPSILON__ ((double)2.22044604925031308085e-16L)
#define _LP64 1
#define __UINT8_C(c) c
#define __INT_LEAST32_TYPE__ int
#define __SIZEOF_WCHAR_T__ 4
#define __UINT64_TYPE__ long long unsigned int
#define __INT_FAST8_TYPE__ signed char
#define __DBL_DECIMAL_DIG__ 17
#define __FXSR__ 1
#define __DEC_EVAL_METHOD__ 2
#define __UINT32_C(c) c ## U
#define __INTMAX_MAX__ 9223372036854775807L
#define __BYTE_ORDER__ __ORDER_LITTLE_ENDIAN__
#define __FLT_DENORM_MIN__ 1.40129846432481707092e-45F
#define __INT8_MAX__ 127
#define __PIC__ 2
#define __UINT_FAST32_TYPE__ unsigned int
#define __CHAR32_TYPE__ unsigned int
#define __FLT_MAX__ 3.40282346638528859812e+38F
#define __INT32_TYPE__ int
#define __SIZEOF_DOUBLE__ 8
#define __FLT_MIN_10_EXP__ (-37)
#define __INTMAX_TYPE__ long int
#define __DEC128_MAX_EXP__ 6145
#define __ATOMIC_CONSUME 1
#define __GNUC_MINOR__ 8
#define __UINTMAX_MAX__ 18446744073709551615UL
#define __DEC32_MANT_DIG__ 7
#define __DBL_MAX_10_EXP__ 308
#define __LDBL_DENORM_MIN__ 3.64519953188247460253e-4951L
#define __INT16_C(c) c
#define __STDC__ 1
#define __PTRDIFF_TYPE__ long int
#define __ATOMIC_SEQ_CST 5
#define __UINT32_TYPE__ unsigned int
#define __UINTPTR_TYPE__ long unsigned int
#define __DEC64_SUBNORMAL_MIN__ 0.000000000000001E-383DD
#define __DEC128_MANT_DIG__ 34
#define __LDBL_MIN_10_EXP__ (-4931)
#define __SIZEOF_LONG_LONG__ 8
#define __GCC_ATOMIC_LLONG_LOCK_FREE 2
#define __LDBL_DIG__ 18
#define __FLT_DECIMAL_DIG__ 9
#define __UINT_FAST16_MAX__ 65535
#define __GNUC_GNU_INLINE__ 1
#define __GCC_ATOMIC_SHORT_LOCK_FREE 2
#define __SSE3__ 1
#define __UINT_FAST8_TYPE__ unsigned char
#define __ATOMIC_ACQ_REL 4
#define __ATOMIC_RELEASE 3

빈 파일의 매크로는 236 개입니다. #include <stdio.h>파일에 추가하면 정의 된 매크로 수가 505 개로 늘어났습니다. 여기에는 모든 종류의 플랫폼 식별 매크로가 포함됩니다.


4
실제로 gcc를 사용하면 다음과 같은 목록을 얻을 수 있습니다.cpp -dM < /dev/null
asveikau

2
그것은 linuxMac OS X 컴퓨터에 정의되어 있지 않습니다. Linux를 실행하지 않습니다 (리눅스를 실행하는 VM이 ​​있지만 ...). <stdio.h>;에 포함 된 헤더로 정의 될 수 있습니다 . 빈 파일을 실행하는 것은 동일하지 않을 수 있습니다.
Jonathan Leffler

20
확장자가 없으므로 /dev/null소스 파일로 사용할 수 -x없으므로 gcc는 C 또는 C ++인지 알 수 없습니다. 당신은 사용할 수 있습니다 gcc -E -dM -x c /dev/null또는 gcc -E -dm -x c++ /dev/null빈 파일을 만들 필요없이 목록을 얻을 수 있습니다.
Chris Dodd

2
@ChrisDodd-여기서 작동합니다. 참고 cpp(전 처리기)는 아닙니다 gcc. 참고 또한 나는 그것을 포기하지 않는 /dev/null입력 파일로, 오히려 내가 만드는 리디렉션 사용하고 있습니다 /dev/null로를 stdin. 또한 @KerrekSB : 내 데비안 시스템 linux이 목록에 있습니다.
asveikau

1
그렇습니다. 빈 파일을 만드는 방법에는 여러 가지가 있습니다. 또한이 될 수 > emptyfile.c또는 : > emptyfile.c또는 dd if=/etc/passwd of=emptyfile.c count=0또는 ...
조나단 레플러

44

에서 info gcc(강조 광산) :

-ansi

C 모드에서 이는에 해당합니다 -std=c90. C ++ 모드에서는와 같습니다 -std=c++98. ISO C90 (컴파일 C 코드), 또는 표준 C의 ++ 등으로, (C ++ 코드를 컴파일 할 때)와 호환되지 않는 GCC의 특정 기능 해제이 회전 asmtypeof키워드, 및 '유닉스'와 같은 매크로를 미리 정의하고 'VAX' 그 사용중인 시스템 유형을 식별하십시오. 또한 바람직하지 않고 거의 사용되지 않는 ISO trigraph 기능을 사용할 수 있습니다. C 컴파일러의 //경우 inline키워드 뿐만 아니라 C ++ 스타일 주석의 인식도 비활성화 합니다.

( 작성되었을 때 더 인기가 있었기 때문에 리눅스 대신 예제에서 vax 를 사용합니다 ;-).

기본 아이디어는 GCC가 -ansi옵션으로 호출 될 때만 ISO 표준을 완전히 준수하려고한다는 것입니다 .


6
GCC을 완전히 준수 (시도), 당신은 지정해야 -ansi 하거나 std=cXX , 어디 XX이며 89, 90, 99, 또는 11, 하나 -pedantic또는 -pedantic-errors. 그것조차도 지나치게 단순화 된 것입니다. 자세한 내용은 설명서 를 참조하십시오.
Keith Thompson

8

이 명령을 사용하십시오

gcc -dM -E - < /dev/null

이것을 얻기 위해

    #define _LP64 1
#define _STDC_PREDEF_H 1
#define __ATOMIC_ACQUIRE 2
#define __ATOMIC_ACQ_REL 4
#define __ATOMIC_CONSUME 1
#define __ATOMIC_HLE_ACQUIRE 65536
#define __ATOMIC_HLE_RELEASE 131072
#define __ATOMIC_RELAXED 0
#define __ATOMIC_RELEASE 3
#define __ATOMIC_SEQ_CST 5
#define __BIGGEST_ALIGNMENT__ 16
#define __BYTE_ORDER__ __ORDER_LITTLE_ENDIAN__
#define __CHAR16_TYPE__ short unsigned int
#define __CHAR32_TYPE__ unsigned int
#define __CHAR_BIT__ 8
#define __DBL_DECIMAL_DIG__ 17
#define __DBL_DENORM_MIN__ ((double)4.94065645841246544177e-324L)
#define __DBL_DIG__ 15
#define __DBL_EPSILON__ ((double)2.22044604925031308085e-16L)
#define __DBL_HAS_DENORM__ 1
#define __DBL_HAS_INFINITY__ 1
#define __DBL_HAS_QUIET_NAN__ 1
#define __DBL_MANT_DIG__ 53
#define __DBL_MAX_10_EXP__ 308
#define __DBL_MAX_EXP__ 1024
#define __DBL_MAX__ ((double)1.79769313486231570815e+308L)
#define __DBL_MIN_10_EXP__ (-307)
#define __DBL_MIN_EXP__ (-1021)
#define __DBL_MIN__ ((double)2.22507385850720138309e-308L)
#define __DEC128_EPSILON__ 1E-33DL
#define __DEC128_MANT_DIG__ 34
#define __DEC128_MAX_EXP__ 6145
#define __DEC128_MAX__ 9.999999999999999999999999999999999E6144DL
#define __DEC128_MIN_EXP__ (-6142)
#define __DEC128_MIN__ 1E-6143DL
#define __DEC128_SUBNORMAL_MIN__ 0.000000000000000000000000000000001E-6143DL
#define __DEC32_EPSILON__ 1E-6DF
#define __DEC32_MANT_DIG__ 7
#define __DEC32_MAX_EXP__ 97
#define __DEC32_MAX__ 9.999999E96DF
#define __DEC32_MIN_EXP__ (-94)
#define __DEC32_MIN__ 1E-95DF
#define __DEC32_SUBNORMAL_MIN__ 0.000001E-95DF
#define __DEC64_EPSILON__ 1E-15DD
#define __DEC64_MANT_DIG__ 16
#define __DEC64_MAX_EXP__ 385
#define __DEC64_MAX__ 9.999999999999999E384DD
#define __DEC64_MIN_EXP__ (-382)
#define __DEC64_MIN__ 1E-383DD
#define __DEC64_SUBNORMAL_MIN__ 0.000000000000001E-383DD
#define __DECIMAL_BID_FORMAT__ 1
#define __DECIMAL_DIG__ 21
#define __DEC_EVAL_METHOD__ 2
#define __ELF__ 1
#define __FINITE_MATH_ONLY__ 0
#define __FLOAT_WORD_ORDER__ __ORDER_LITTLE_ENDIAN__
#define __FLT_DECIMAL_DIG__ 9
#define __FLT_DENORM_MIN__ 1.40129846432481707092e-45F
#define __FLT_DIG__ 6
#define __FLT_EPSILON__ 1.19209289550781250000e-7F
#define __FLT_EVAL_METHOD__ 0
#define __FLT_HAS_DENORM__ 1
#define __FLT_HAS_INFINITY__ 1
#define __FLT_HAS_QUIET_NAN__ 1
#define __FLT_MANT_DIG__ 24
#define __FLT_MAX_10_EXP__ 38
#define __FLT_MAX_EXP__ 128
#define __FLT_MAX__ 3.40282346638528859812e+38F
#define __FLT_MIN_10_EXP__ (-37)
#define __FLT_MIN_EXP__ (-125)
#define __FLT_MIN__ 1.17549435082228750797e-38F
#define __FLT_RADIX__ 2
#define __FXSR__ 1
#define __GCC_ASM_FLAG_OUTPUTS__ 1
#define __GCC_ATOMIC_BOOL_LOCK_FREE 2
#define __GCC_ATOMIC_CHAR16_T_LOCK_FREE 2
#define __GCC_ATOMIC_CHAR32_T_LOCK_FREE 2
#define __GCC_ATOMIC_CHAR_LOCK_FREE 2
#define __GCC_ATOMIC_INT_LOCK_FREE 2
#define __GCC_ATOMIC_LLONG_LOCK_FREE 2
#define __GCC_ATOMIC_LONG_LOCK_FREE 2
#define __GCC_ATOMIC_POINTER_LOCK_FREE 2
#define __GCC_ATOMIC_SHORT_LOCK_FREE 2
#define __GCC_ATOMIC_TEST_AND_SET_TRUEVAL 1
#define __GCC_ATOMIC_WCHAR_T_LOCK_FREE 2
#define __GCC_HAVE_DWARF2_CFI_ASM 1
#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_1 1
#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_2 1
#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_4 1
#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_8 1
#define __GCC_IEC_559 2
#define __GCC_IEC_559_COMPLEX 2
#define __GNUC_MINOR__ 3
#define __GNUC_PATCHLEVEL__ 0
#define __GNUC_STDC_INLINE__ 1
#define __GNUC__ 6
#define __GXX_ABI_VERSION 1010
#define __INT16_C(c) c
#define __INT16_MAX__ 0x7fff
#define __INT16_TYPE__ short int
#define __INT32_C(c) c
#define __INT32_MAX__ 0x7fffffff
#define __INT32_TYPE__ int
#define __INT64_C(c) c ## L
#define __INT64_MAX__ 0x7fffffffffffffffL
#define __INT64_TYPE__ long int
#define __INT8_C(c) c
#define __INT8_MAX__ 0x7f
#define __INT8_TYPE__ signed char
#define __INTMAX_C(c) c ## L
#define __INTMAX_MAX__ 0x7fffffffffffffffL
#define __INTMAX_TYPE__ long int
#define __INTPTR_MAX__ 0x7fffffffffffffffL
#define __INTPTR_TYPE__ long int
#define __INT_FAST16_MAX__ 0x7fffffffffffffffL
#define __INT_FAST16_TYPE__ long int
#define __INT_FAST32_MAX__ 0x7fffffffffffffffL
#define __INT_FAST32_TYPE__ long int
#define __INT_FAST64_MAX__ 0x7fffffffffffffffL
#define __INT_FAST64_TYPE__ long int
#define __INT_FAST8_MAX__ 0x7f
#define __INT_FAST8_TYPE__ signed char
#define __INT_LEAST16_MAX__ 0x7fff
#define __INT_LEAST16_TYPE__ short int
#define __INT_LEAST32_MAX__ 0x7fffffff
#define __INT_LEAST32_TYPE__ int
#define __INT_LEAST64_MAX__ 0x7fffffffffffffffL
#define __INT_LEAST64_TYPE__ long int
#define __INT_LEAST8_MAX__ 0x7f
#define __INT_LEAST8_TYPE__ signed char
#define __INT_MAX__ 0x7fffffff
#define __LDBL_DENORM_MIN__ 3.64519953188247460253e-4951L
#define __LDBL_DIG__ 18
#define __LDBL_EPSILON__ 1.08420217248550443401e-19L
#define __LDBL_HAS_DENORM__ 1
#define __LDBL_HAS_INFINITY__ 1
#define __LDBL_HAS_QUIET_NAN__ 1
#define __LDBL_MANT_DIG__ 64
#define __LDBL_MAX_10_EXP__ 4932
#define __LDBL_MAX_EXP__ 16384
#define __LDBL_MAX__ 1.18973149535723176502e+4932L
#define __LDBL_MIN_10_EXP__ (-4931)
#define __LDBL_MIN_EXP__ (-16381)
#define __LDBL_MIN__ 3.36210314311209350626e-4932L
#define __LONG_LONG_MAX__ 0x7fffffffffffffffLL
#define __LONG_MAX__ 0x7fffffffffffffffL
#define __LP64__ 1
#define __MMX__ 1
#define __NO_INLINE__ 1
#define __ORDER_BIG_ENDIAN__ 4321
#define __ORDER_LITTLE_ENDIAN__ 1234
#define __ORDER_PDP_ENDIAN__ 3412
#define __PIC__ 2
#define __PIE__ 2
#define __PRAGMA_REDEFINE_EXTNAME 1
#define __PTRDIFF_MAX__ 0x7fffffffffffffffL
#define __PTRDIFF_TYPE__ long int
#define __REGISTER_PREFIX__ 
#define __SCHAR_MAX__ 0x7f
#define __SEG_FS 1
#define __SEG_GS 1
#define __SHRT_MAX__ 0x7fff
#define __SIG_ATOMIC_MAX__ 0x7fffffff
#define __SIG_ATOMIC_MIN__ (-__SIG_ATOMIC_MAX__ - 1)
#define __SIG_ATOMIC_TYPE__ int
#define __SIZEOF_DOUBLE__ 8
#define __SIZEOF_FLOAT128__ 16
#define __SIZEOF_FLOAT80__ 16
#define __SIZEOF_FLOAT__ 4
#define __SIZEOF_INT128__ 16
#define __SIZEOF_INT__ 4
#define __SIZEOF_LONG_DOUBLE__ 16
#define __SIZEOF_LONG_LONG__ 8
#define __SIZEOF_LONG__ 8
#define __SIZEOF_POINTER__ 8
#define __SIZEOF_PTRDIFF_T__ 8
#define __SIZEOF_SHORT__ 2
#define __SIZEOF_SIZE_T__ 8
#define __SIZEOF_WCHAR_T__ 4
#define __SIZEOF_WINT_T__ 4
#define __SIZE_MAX__ 0xffffffffffffffffUL
#define __SIZE_TYPE__ long unsigned int
#define __SSE2_MATH__ 1
#define __SSE2__ 1
#define __SSE_MATH__ 1
#define __SSE__ 1
#define __SSP_STRONG__ 3
#define __STDC_HOSTED__ 1
#define __STDC_IEC_559_COMPLEX__ 1
#define __STDC_IEC_559__ 1
#define __STDC_ISO_10646__ 201605L
#define __STDC_NO_THREADS__ 1
#define __STDC_UTF_16__ 1
#define __STDC_UTF_32__ 1
#define __STDC_VERSION__ 201112L
#define __STDC__ 1
#define __UINT16_C(c) c
#define __UINT16_MAX__ 0xffff
#define __UINT16_TYPE__ short unsigned int
#define __UINT32_C(c) c ## U
#define __UINT32_MAX__ 0xffffffffU
#define __UINT32_TYPE__ unsigned int
#define __UINT64_C(c) c ## UL
#define __UINT64_MAX__ 0xffffffffffffffffUL
#define __UINT64_TYPE__ long unsigned int
#define __UINT8_C(c) c
#define __UINT8_MAX__ 0xff
#define __UINT8_TYPE__ unsigned char
#define __UINTMAX_C(c) c ## UL
#define __UINTMAX_MAX__ 0xffffffffffffffffUL
#define __UINTMAX_TYPE__ long unsigned int
#define __UINTPTR_MAX__ 0xffffffffffffffffUL
#define __UINTPTR_TYPE__ long unsigned int
#define __UINT_FAST16_MAX__ 0xffffffffffffffffUL
#define __UINT_FAST16_TYPE__ long unsigned int
#define __UINT_FAST32_MAX__ 0xffffffffffffffffUL
#define __UINT_FAST32_TYPE__ long unsigned int
#define __UINT_FAST64_MAX__ 0xffffffffffffffffUL
#define __UINT_FAST64_TYPE__ long unsigned int
#define __UINT_FAST8_MAX__ 0xff
#define __UINT_FAST8_TYPE__ unsigned char
#define __UINT_LEAST16_MAX__ 0xffff
#define __UINT_LEAST16_TYPE__ short unsigned int
#define __UINT_LEAST32_MAX__ 0xffffffffU
#define __UINT_LEAST32_TYPE__ unsigned int
#define __UINT_LEAST64_MAX__ 0xffffffffffffffffUL
#define __UINT_LEAST64_TYPE__ long unsigned int
#define __UINT_LEAST8_MAX__ 0xff
#define __UINT_LEAST8_TYPE__ unsigned char
#define __USER_LABEL_PREFIX__ 
#define __VERSION__ "6.3.0 20170406"
#define __WCHAR_MAX__ 0x7fffffff
#define __WCHAR_MIN__ (-__WCHAR_MAX__ - 1)
#define __WCHAR_TYPE__ int
#define __WINT_MAX__ 0xffffffffU
#define __WINT_MIN__ 0U
#define __WINT_TYPE__ unsigned int
#define __amd64 1
#define __amd64__ 1
#define __code_model_small__ 1
#define __gnu_linux__ 1
#define __has_include(STR) __has_include__(STR)
#define __has_include_next(STR) __has_include_next__(STR)
#define __k8 1
#define __k8__ 1
#define __linux 1
#define __linux__ 1
#define __pic__ 2
#define __pie__ 2
#define __unix 1
#define __unix__ 1
#define __x86_64 1
#define __x86_64__ 1
#define linux 1
#define unix 1
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.