[c-preprocessor] #ifdef 및 #ifndef의 역할

#define one 0
#ifdef one
printf("one is defined ");
#ifndef one
printf("one is not defined ");

여기서 #ifdef및 의 역할은 무엇이며 #ifndef출력은 무엇입니까?



답변

ifdef/endif또는 ifndef/endif 내부의 텍스트 는 조건에 따라 전처리기에 의해 남아 있거나 제거됩니다. ifdef“다음이 정의 된 경우”를 ifndef의미하고 “다음이 정의 되지 않은 경우 “를 의미 합니다.

그래서:

#define one 0
#ifdef one
    printf("one is defined ");
#endif
#ifndef one
    printf("one is not defined ");
#endif

다음과 같습니다.

printf("one is defined ");

이후 one정의는 그래서 ifdef사실과는 ifndeffalse입니다. 그것이 무엇으로 정의 되어 있는지는 중요하지 않습니다 . 비슷한 (내 생각에 더 나은) 코드는 다음과 같습니다.

#define one 0
#ifdef one
    printf("one is defined ");
#else
    printf("one is not defined ");
#endif

이 특정 상황에서 의도를 더 명확하게 지정하기 때문입니다.

귀하의 특정 경우에는 이후 텍스트 가 정의되어 ifdef제거되지 않습니다 one. 애프터 텍스트가 ifndef 되어 같은 이유로 제거. endif어떤 지점에 두 개의 닫는 선 이 있어야 하며 첫 번째 줄은 다음과 같이 다시 포함되기 시작합니다.

     #define one 0
+--- #ifdef one
|    printf("one is defined ");     // Everything in here is included.
| +- #ifndef one
| |  printf("one is not defined "); // Everything in here is excluded.
| |  :
| +- #endif
|    :                              // Everything in here is included again.
+--- #endif


답변

누군가는 질문에 약간의 함정이 있음을 언급해야합니다. #ifdef다음 기호가 #define명령 줄을 통해 또는 명령 줄을 통해 정의되었는지 여부 만 확인 하지만 그 값 (사실상 대체)은 관련이 없습니다. 당신은 심지어 쓸 수 있습니다

#define one

프리 컴파일러는이를 받아들입니다. 하지만 사용 #if한다면 다른 것입니다.

#define one 0
#if one
    printf("one evaluates to a truth ");
#endif
#if !one
    printf("one does not evaluate to truth ");
#endif

줄 것이다 one does not evaluate to truth. 키워드를 defined사용하면 원하는 동작을 얻을 수 있습니다.

#if defined(one)

따라서 #ifdef

#if구조 의 장점은 코드 경로를 더 잘 처리 할 수있게하고 이전 #ifdef/ #ifndef쌍으로 이와 같은 작업을 시도하는 것 입니다.

#if defined(ORA_PROC) || defined(__GNUC) && __GNUC_VERSION > 300


답변

“#if one”은 “#define one”이 작성 되었다면 “#if one”이 실행되고 그렇지 않으면 “#ifndef one”이 실행됨을 의미합니다.

이것은 C 언어의 if, then, else 분기 문에 해당하는 C 전 처리기 (CPP) 지시문입니다.

즉, {#define one} then printf ( “one은 진실로 평가됩니다.”); else printf ( “하나는 정의되지 않았습니다”); 따라서 #define 한 명령문이 없으면 명령문의 else 분기가 실행됩니다.


답변

printf가 함수 블록에 없기 때문에 코드가 이상하게 보입니다.


답변