2013-04-30 3 views
-1

내 C++ 지식 (또는 부족)에서 간단히 말해서 FOO는 이것이 정의되었을 때 괄호 안에있는 것으로 대체 될 것입니다. 그러나 괄호가 비어 있다면 어떻게됩니까? 0과 동등한가요? 즉 #ifdef foo (0)#ifdef foo ()과 동일한 작업을 수행 할 예정입니까? 동등한 경우 빈 괄호로 사용할 유용한 효과가 있습니까?빈 괄호가있는 정의에서는 어떻게됩니까? 예 : #define FOO()?

답변

2

이 매크로 확장 단지 어떤으로 확대 할 만지지 않는다, 아무것도 FOO() 대체 완벽하게 괜찮습니다 (그리고 헤더 파일에 L/R/l/r 매크로를 숨기면 아무도 당신이 한 일을 이해할 수 없습니다.) 적어도 일부 지역에서는 매크로가 실제로 확장되도록 보장해야합니다.

이 문

#ifdef CRAPFOO() 

(GCC에서 "#ifdef와의 마지막에 추가 토큰", 다른 컴파일러는 다른 오류를 제공 할 수 있습니다.

#define CRAPFOO() 
#ifdef CRAPFOO 
    do something 
#else 
    not something 
#endif 

는 다음과 같이 do something을 줄 것이다 깨끗하게 컴파일되지 않습니다 결과.

+0

Petersson 당신은 남자입니다. 예를 들어 주셔서 감사합니다. 또한 당신은이 질문을하기 위해 나를 여기에 데려다 준 문제를 예상했으며 어떤 일이 일어 났는지에 대해서도 대답했습니다. 그래서 예, gcc는이 정의에서 오류를 throw합니다. 또한 나는 그것이 어떤 가지로 들어갈 지 이해하지 못했습니다. – Palax

2

#define은 절대 바보 같은 텍스트 대체품입니다. 그래서 :

#define FOO() 

int main() 
{ 
    FOO; 
} 

는 "단지 전처리 않는다"즉, (내가 너무 clang 생각)

int main() 
{ 
    (); 
} 

당신은 g++-E 옵션을 사용하여이 문제를 테스트 할 수 있습니다되고, 또는 동등, 다만 cpp을 실행 도구, c 전 처리기입니다. 즉

$ echo -e "#define FOO()\nint main()\n{\n FOO;\n}" > def.cpp ; g++ -E def.cpp 
# 1 "def.cpp" 
# 1 "<command-line>" 
# 1 "def.cpp" 

int main() 
{ 
    (); 
} 

(이 리눅스/유닉스 명령 행 도구입니다).

+2

'#define FOO()'와'#define FOO()'의 차이점에 유의하십시오. 나는'#define FOO()'를 본 적이 없다고 생각하지만'#define FOO()'가 빈번하다. –

0

#define은 전 처리기 지시문이며 실제로 코드를 컴파일하기 전에 이 발생하는 바보 같은 텍스트 교체 규칙입니다. 매크로 정의를 적용 할 때 아직 코드 모델이 없습니다.

#define FOO() 

()FOO의 모든 발생을 대체합니다.

#define FOO (0) 

(0)FOO의 모든 발생을 대체합니다.

#define FOO 0 

하지 동일한 (0) 등 (이 차이가있는 경우가있다)이다 0FOO의 모든 발생을 대체한다.

#include <stdio.h> 

#define L (
#define R) 
#define l { 
#define r } 
#define LR() 

int main LR 
l 
    printf L "Hello, World\n" R; 
    return 0; 
r 

하는 컴파일 것이다 그러나

,

#define FOO() 

매크로가 확장 FOO