#if 및 #define MY_MACRO (0)
#if를 사용하면 "정의"매크로, 즉 "(0)"으로 대체 될 코드에서 검색되는 항목이 생성되었음을 의미합니다. 이것은 잠재적 인 코드 수정으로 코드를 오염시키기 때문에 C ++에서보고 싶지 않은 "매크로 지옥"입니다.
예를 들면 :
#define MY_MACRO (0)
int doSomething(int p_iValue)
{
return p_iValue + 1 ;
}
int main(int argc, char **argv)
{
int MY_MACRO = 25 ;
doSomething(MY_MACRO) ;
return 0;
}
g ++에서 다음 오류를 제공합니다.
main.cpp|408|error: lvalue required as left operand of assignment|
||=== Build finished: 1 errors, 0 warnings ===|
단 하나의 오류입니다.
이는 매크로가 C ++ 코드와 성공적으로 상호 작용했음을 의미합니다. 함수 호출이 성공했습니다. 이 간단한 경우에는 재미 있습니다. 그러나 내 코드로 조용히 매크로를 사용하는 경험은 기쁨과 충만 함으로 가득 차 있지 않으므로 ...
#ifdef 및 #define MY_MACRO
#ifdef를 사용한다는 것은 무언가를 "정의"한다는 의미입니다. 가치를 부여하는 것이 아닙니다. 여전히 오염되고 있지만, 적어도 "아무것도 대체하지 않을 것"이며 C ++ 코드에서는 후행 코드 문으로 인식되지 않습니다. 위의 동일한 코드에서 간단한 정의를 사용하면 다음과 같습니다.
#define MY_MACRO
int doSomething(int p_iValue)
{
return p_iValue + 1 ;
}
int main(int argc, char **argv)
{
int MY_MACRO = 25 ;
doSomething(MY_MACRO) ;
return 0;
}
다음 경고를 제공합니다.
main.cpp||In function ‘int main(int, char**)’:|
main.cpp|406|error: expected unqualified-id before ‘=’ token|
main.cpp|399|error: too few arguments to function ‘int doSomething(int)’|
main.cpp|407|error: at this point in file|
||=== Build finished: 3 errors, 0 warnings ===|
그래서...
결론
내 코드에 매크로없이 살고 싶지만 여러 가지 이유로 (헤더 가드 또는 디버그 매크로 정의) 할 수 없습니다.
그러나 적어도 나는 합법적 인 C ++ 코드로 가능한 최소한의 상호 작용을 만들고 싶습니다. 즉, #ifdef 및 #ifndef (또는 Jim Buck이 제안한대로 정의 된 경우 #ifndef)를 사용하여 값없이 #define을 사용하고, 무엇보다도 이름을 너무 길고 외계인이 사용하지 않을 것입니다. "우연히", 합법적 인 C ++ 코드에는 영향을 미치지 않습니다.
Post Scriptum
이제 내 게시물을 다시 읽을 때 정의에 추가 할 올바른 C ++가 아닐 수있는 값을 찾으려고하면 안되는지 궁금합니다. 같은 것
#define MY_MACRO @@@@@@@@@@@@@@@@@@
#ifdef 및 #ifndef와 함께 사용할 수 있지만 함수 내에서 사용하면 코드가 컴파일되지 않습니다 ... g ++에서 성공적으로 시도했는데 오류가 발생했습니다.
main.cpp|410|error: stray ‘@’ in program|
흥미 롭군. :-)
#if
, 당신은 또한 다음 사용할 수 있습니다#elif
와는 달리, 일관된 방식으로#ifdef
.#define BLAH
#define BLAH 1
#if BLAH