이 컴파일러 지침의 차이점은 무엇입니까?
-
19-09-2019 - |
문제
이 지침의 차이점은 무엇입니까?
#ifdef FOO
#if defined FOO
#if defined(FOO)
CCS 컴파일러를 사용하고 있지만 다른 사람에 관심이 있습니다. 씨 컴파일러도 마찬가지입니다.
해결책
내가 본 것에서, 주된 용도 #if defined
한 줄에서 여러 거시 정의를 확인하는 것입니다. 그렇지 않으면 단일 매크로 정의 조건부의 경우 내가 아는 한 동일합니다.
#include <stdio.h>
int main()
{
#if defined(FOO) && defined(BAR)
printf("foobar!\n");
#else
printf("nothing.\n");
#endif
return 0;
}
$ tcc -DFOO -run a.c nothing. $ tcc -DBAR -run a.c nothing. $ tcc -DFOO -DBAR -run a.c foobar!
또한 위의 프로그램은 잘 컴파일합니다 gcc -Wall -ansi a.c
그래서 제안합니다 #if defined
정확한 ansi C입니다. 또한 이것은 1987 년의 ANSI 요약 기울기 #if defined
ANSI 표준에 따른 전처리 업체의 새로 정의 된 동작으로 ~해야 한다 사용할 ANSI 호환 컴파일러에서 표준을 유지하십시오.
당신이 사용하지 않았다면 #if defined
, 당신은해야합니다
#ifdef FOO
#ifdef BAR
printf("foobar!\n");
#endif /* BAR */
#endif /* FOO */
또한, C 전 처리기의 Redhat 매뉴얼 말한다
#if defined MACRO
정확히 동일합니다#ifdef MACRO
.
다른 팁
C99 표준에 따르면 3 가지 양식 모두 정확히 동등하고 유효합니다. 일반적으로 #ifdef
다른 두 형태보다 짧기 때문에 선호되지만 다른 형태를 사용하려는 상황이 있습니다.
여러 기호의 정의 또는 더 복잡한 표현식을 테스트하는 경우 :
#if defined(ONE_THING) && define(ANOTHER_THING) && (3 < 4) ... #endif
조항이 여러 개있는 경우 사용하기가 훨씬 쉽습니다.
#elif defined(...)
~보다#else
,#ifdef
:#if defined(ONE_THING) ... #elif defined(ANOTHER_THING) ... #elif defined(THIRD_THING) ... #else ... #endif
괄호의 사용 defined
선택 사항입니다. 나는 그들을 사용하여 명확성을 더하는 것을 선호합니다.
#ifdef 짧습니다 #if 정의 그리고 나는 당신이 둘 다 괄호가 필요하지 않다고 생각합니다. 그래서 기본적으로 그들은 동일합니다.
Turbo C에서 오는데, 나는 보는 데 익숙해 #ifdef 보다는 #if 정의
원래 만 있었다 #ifdef
, 하지만 때 #if
그것을 따라 와서 가질 필요가 있었다 defined()
위해서는 #if
슈퍼 세트 #ifdef
.