2016-09-02 3 views
15

디버그자세한 정보 코드가 인 코드가 있습니다. 난 그냥 더 적절한 내가 읽은#if는 #ifdef MACRO와 동일한 MACRO를 정의합니까?

#ifdef debug 
    // code 
#endif 

사용

#if(debug) 
    //code 
#endif 

을 사용하고 있지만입니다되어, 지금까지 내 코드에서

#define verbose TRUE 
#define debug TRUE 

, 같은 내 헤더 파일에 정의 전 처리기 매크로에 관한 것이었지만 그 당시에는 의미가 없었습니다. 그래서 질문이 있습니다 #if defined MACRO#ifdef MACRO과 동일합니까? 특정 코드 섹션을 활성화/비활성화하는 것이 더 낫습니다.

+8

이것은'# ifdef'와'if'를 비교하는 것 같고, 제목에서 알 수 있듯이'#if defined'가 아닌 것 같습니다. –

+3

둘 사이의 차이점은 # ifdef는 단일 조건 인 만 사용할 수 있고 #if defined (NAME)는 복합 조건을 처리 할 수 ​​있다는 것입니다. – LPs

+2

BTW, 편집 후 코드가 다릅니다 :'# if' debug는'debug'가 true인지 확인하고'# ifdef'는'debug'가 정의 된 경우에만 검사합니다. – LPs

답변

16
#ifdef MACRO 
#if defined (MACRO) 

정확히 똑같은 것을합니다. 그러나 정의 된 (MACRO)은 #if 내부에서 0 또는 1로 평가되는 표현식이며 다른 표현식과 결합 될 수 있습니다. 예를 들어

#if defined (MACRO) && ! defined (MACRO2) 
    // Do this 
#else 
    // Do that 
#endif 

#ifdef로 시도해보십시오. 코드가 실제로 서툴러지기 전에는 불가능합니다.

+1

'정의 된'는 괄호를 요구하지 않는다. 여기에는 정의 된 (식별자)와 정의 된 식별자가 있습니다. – Kaz

5

#if defined(MACRO)#ifdef MACRO과 동일하지만 더 길다. 반면에 || 또는 &&과 함께 추가 조건을 추가 할 수 있습니다.

#if MACRO#ifdef MACRO과 유사하지만 100 %는 아닙니다. MACRO0 인 경우 #if MACRO은 음수가됩니다. MACRO이 정의되고 0이 아니어야합니다. #ifdef은 값이없는 경우에도 정의되어 있는지 여부 만 확인합니다 (#define MACRO).

지금 값 1 또는 0으로 비활성화 정의를 #if을 사용하여 활성화/현대 : 우리는 충분히 우리의 두뇌 랙 경우, 우리는 차이를 가지고 올 수

#define FLAG_X 1 // or 0

1

. 그러나 그것은 불분명하고 정의되지 않은 동작을 포함한다, 그래서 우리가 걱정하는 모든 코드가 엄격하게

#if defined ... 형태 ISO C.에 부합하는 이전 #define defined ... 매크로가 처리 된 경우 다르게 행동에 취약 여부를 경우 그것은 중요하지입니다 . 이러한 매크로를 제외하고

이전 평가, 지배 상수식이 될 것 전처리 토큰의 목록에서 매크로 호출이 대체된다 (다음 ISO C99 표준에서는이 #if#elif 지침에 관해서, 기록 된 정의 된 단항 연산자로 수정 된 이름). 일반 텍스트와 동일합니다.

단항 연산자 defined이 매크로로 취급되지 않도록 인식되고 보호되어야한다는 요구 사항이 없습니다. 이되는 "전처리 토큰 중 하나 일뿐입니다. 표현"이됩니다. defined 연산자는 확장에서 인수를 보호하기위한 목적으로 만이 단계에서 인식됩니다.

하면 #ifdef에 영향을주지 않으면 서, 따라서 #if defined 방해 매크로 단순히 서서 허용하고, defined의 발생 이후 (#if 전처리 지시어의 인수 포함) 교체로 define의 정의.

아마도이 언어 영역은 C99 이후 강화되었습니다.

3

나는 귀하의 질문에 올바르게 제목이 오해의 소지가 읽고 있어요 경우는 바이너리 모드를 지정하는 데 사용 모두 그들은 동일하지하지만 그들이 할 수있는 (그리고 종종)

Is #if MACRO equivalent to #ifdef MACRO? 

해야 하나 또는 떨어져서. 내 의견으로는, 개인적인 취향의 문제입니다.

사용 모드를 확인 당신은 첫 번째 옵션을 사용하고 하나는

#define verbose true 

또는

#define verbose false 

하고이 중

#if verbose 

또는

#if !verbose 

사실, 참/거짓, C/C++ 값 (또는 될 수 있음) 및 전처리기에는 없기 때문에 TRUE 또는 1 대신 TRUE와 FALSE 또는 FALSE 대신 0을 사용할 것을 권장합니다. C/C++ 값에 대한 액세스

어쨌든, 바이너리 모드를 지정하는 다른 일반적인 방법은 플래그를 정의하거나 경우에 당신도

#define verbose any thing (including nothing) goes here 

이 있거나 #DEFINE을 남길 수 있습니다 정의되지 않은 떠날 중 하나입니다.

다음 중 하나를

#ifdef verbose 

또는 동등한

#if defined(verbose) 

참고로, 플래그가 정의되어 있는지 여부를 테스트 할 수 있습니다 :이 경우, 플래그의 값을 테스트하지 않는 당신 정의되어 있는지 여부 만 테스트하면됩니다. 더 편리 경우

당신은 또한 플래그가

#ifndef verbose 

또는 동등한 중 하나에 정의되지 여부를 테스트 할 수 있습니다

#if !defined(verbose) 
+0

[TO OP] 잘못된 제목 : 수정하십시오. 이렇게하면 다른 답이 무효가되지만 그렇게해야합니다. –

5

아니, 그들은 전혀 동일합니다. MACRO이 0이 아닌 것으로 계산되면 #if MACRO 분기가 컴파일됩니다. 반면에 #ifdef MACRO 브랜치는 MACRO인 경우으로 정의됩니다.라인 printf("#if VAR_SET_TO_FALSE\n");은 아니지만 그래서 라인 printf("#ifdef VAR_SET_TO_FALSE\n");

#include <stdio.h> 

#define VAR_SET_TO_TRUE 1 
#define VAR_SET_TO_FALSE 0 

int main() 
{ 

#if VAR_SET_TO_TRUE 
    printf("#if VAR_SET_TO_TRUE\n"); 
#endif 

#if VAR_SET_TO_FALSE 
    printf("#if VAR_SET_TO_FALSE\n"); 
#endif 

#if VAR_UNSET 
    printf("#if VAR_UNSET\n"); 
#endif 



#ifdef VAR_SET_TO_TRUE 
    printf("#ifdef VAR_SET_TO_TRUE\n"); 
#endif 

#ifdef VAR_SET_TO_FALSE 
    printf("#ifdef VAR_SET_TO_FALSE\n"); 
#endif 

#ifdef VAR_UNSET 
    printf("#ifdef VAR_UNSET\n"); 
#endif 

} 

출력됩니다

#if VAR_SET_TO_TRUE 
#ifdef VAR_SET_TO_TRUE 
#ifdef VAR_SET_TO_FALSE 

참고 컴파일된다. 첫 번째 것은 이어도 VAR_SET_TO_FALSE으로 정의 되었기 때문에 컴파일됩니다.

+1

OP는'# ifdef'와'#if defined'의 차이점에 대해서'# if'와'#if defined '의 차이가 아닌 다른 질문을하고 있습니다. 또한 메모리에서'# if' 절은 RHS가 1이 아닌 0이 아닌 것으로 평가되면 실행됩니다. – abligh