ifdef의 부울 : "#ifdef A && B"가 "#if defined (A) && defined (B)"와 동일합니까?


83

C ++에서는 다음과 같습니다.

#ifdef A && B

다음과 동일 :

#if defined(A) && defined(B)

?

그렇지 않다고 생각했지만 컴파일러 (VS2005)에서 차이점을 찾을 수 없었습니다.


1
중복 가능성 : stackoverflow.com/questions/965700/… C 및 C ++ 인 것을 알지만 전처리 기는 기본적으로 동일합니다. stackoverflow.com/questions/5085533/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

누군가가 표준을 인용하고 해석하여 그것이 합법적인지 여부를 결정할 것입니까 (확실히 작동하지 않아야하지만 컴파일되어야 함)? 15 분 동안 "16 개의 전처리 지시문"챕터를 읽은 후에도 할 수 없습니다.
치로 틸리郝海东冠状病六四事件法轮功

답변:


92

그들은 동일하지 않습니다. 첫 번째는 작동하지 않습니다 (gcc 4.4.1에서 테스트했습니다). 오류 메시지 :

test.cc:1:15 : 경고 : #ifdef 지시문 끝에 추가 토큰

여러 항목이 정의되어 있는지 확인하려면 두 번째 항목을 사용하십시오.


확인해 주셔서 감사합니다. 나는 Microsoft의 컴파일러를 사용하고 있으며 허용하는 것 같지만 나에게 옳지 않은 것 같습니다.
criddell

2
단일 컴파일러를 사용하여 증명할 수 없습니다. 이것이 유효하지 않다는 표준을 참조하십시오.
궤도

@LightnessRacesinOrbit 그러나 일부 컴파일러는 표준을 확장합니다. "특정 컴파일러에서 작동한다"는 말은 그것이 타당하다는 것을 증명하려는 시도가 아닙니다. 특정 컴파일러가 특정 방식으로 표준을 확장한다는 점에 주목합니다.
기금 모니카의 소송

@QPaysTaxes : 동의하지만이 답변은 그렇게하지 않습니다. C ++에 대한 일반적인 사실 인 것처럼 보이는 "in C ++ ...."로 시작하는 질문에 응답합니다. 언뜻보기에 Evan은 하나의 컴파일러로 자신의 이론을 테스트 한 다음 언어 자체의 보증을 통해 모든 사람에게 사실이라고 가정했습니다. 그가이 동작이 GCC 확장이라고 판단하고 "이것은 GCC 확장입니다"(참조 자료에 대한 링크 포함)라고 말하면 괜찮을 것입니다! (실제로이 특정 질문에 대한 답변은 아니지만)
Lightness Races in Orbit

1
긍정적 인 테스트의 어떤 수는 있음 "을 증명하지"수 있지만 입니다 유효 하나의 음은 아니라는 것을 증명하기에 적절하다거나 사용이 적어도 바람직하지입니다. 표준을 참조하는 것이 좋지만, 적어도 하나의 주요 컴파일러에서 작동하지 않는다는 것을 증명하는 것은이 논의의 목적을 위해 "작동하지 않는다"는 충분한 증거입니다.
zeel

48

조건부 컴파일

#if 지시문에서 정의 된 연산자를 사용하여 전 처리기 행 내에서 0 또는 1로 평가되는 표현식을 사용할 수 있습니다. 이렇게하면 중첩 된 전처리 지시문을 사용하지 않아도됩니다. 식별자 주위의 괄호는 선택 사항입니다. 예를 들면 :

#if defined (MAX) && ! defined (MIN)  

정의 된 연산자를 사용하지 않고 위의 예를 수행하려면 다음 두 가지 지시문을 포함해야합니다.

#ifdef max 
#ifndef min

2
당신의 말은 맞지만, 이것은 전혀 대답이되지 않습니다. 그는 두 사람이 같은지 물었습니다 ... 그들은 그렇지 않습니다.
Evan Teran

1
나는 그것이 "같지 않다"라고 말하는 것 같고, #ifdef COND_A && COND_B
Svetlozar Angelov

어느 쪽이든 이것은 유용한 메모입니다.
Paul Masri-Stone

2

다음 결과는 동일합니다.

1.

#define A
#define B
#if(defined A && defined B)
printf("define test");
#endif

2.

#ifdef A
#ifdef B
printf("define test");
#endif
#endif

1
이것이 질문에 어떻게 대답하는지 설명하기 위해 몇 가지 설명을 추가해 주시겠습니까? 대답에서 명확하지 않습니다.
James Wood

이 답변은 기술적으로 정확하지만 질문에 대한 정확한 답변이 아니며 잘못된 사용법을 암시합니다. 두 블록이 동일한 작업을 수행하지만 두 개의 if를 중첩하는 것은 &&를 사용하는 것과 동일하지 않습니다. 와 같은 다른 조건으로 #else인해 문제가 발생할 수 있습니다. 첫 번째 옵션 만이 실제로 질문자가 요청한 것을 정확히 의미합니다.
zeel

1

OP와 약간 다른 예 (UNIX / g ++)를 찾는 사람들에게는 도움이 될 수 있습니다.

`

#if(defined A && defined B && defined C)
    const string foo = "xyz";
#else
#if(defined A && defined B)
    const string foo = "xy";
#else
#if(defined A && defined C)
    const string foo = "xz";
#else
#ifdef A
    const string foo = "x";
#endif
#endif
#endif
#endif

#else #if 대신 #elif를 사용하고 끝에 10 억 개의 #endif를 사용하지 않는 이유는 무엇입니까 ...?
Elliott

-3

VS2015에서는 위의 어느 것도 작동하지 않습니다. 올바른 지시문은 다음과 같습니다.

#if (MAX && !MIN)

여기에서 더보기


2
C ++ 문서가 아닌 C # 문서에 연결했습니다.
Revolver_Ocelot
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.