2014-01-08 2 views
0
#include <iostream> 
#define help(a) #a 
#define xhelp(a) help(a) 
#define glue(a,b) a##b 
#define xglue(a,b) glue(a,b) 
#define HIGHLOW "hello" 
#define LOWLOW ",world" 
int main() 
{ 
       std::cout<<xhelp(xglue(HIGH,LOW))<<std::endl; 
       return 0; 
} 

여기가 내 테스트 코드입니다. MACOR xglue (HIGH, LOW)의 확산을 알고 싶습니다.재귀 적 매크로 스프레드에 대한 결과는 무엇입니까?

이 나를 위해, 나는 결과가 "안녕하세요"

생각하지만 난 하나 개의 웹 사이트에서 배우고, 그 결과는 "안녕, 세계"입니다.

정말 혼란 스럽습니다.

내 코드의 결과는 "안녕하세요"입니다.

아무도 나를 도와 줄 수 있습니까?

은 내가 xgule (HIGH, LOW) = 접착제 (HIGH, LOW) = HIGHLOW = "안녕하세요"

웹 사이트 xglue 쇼 (HIGH, LOW) = 접착제 (HIGH, LOW "세계"생각) = "hello, world"

+0

결과 :' "\"hello \ "" – BLUEPIXY

+0

결과는 ""hello "'입니다. wesite 링크를 게시하십시오. – sujin

+0

중국 웹 사이트입니다. 웹 사이트 http://hi.baidu.com/feixue/item/b22cdca63f778417a9cfb729 – user2701639

답변

0

우선, 재귀 매크로가 없습니다.

예제에서 대부분의 작업은 두 개의 전 처리기 연산자 ###에 의해 수행됩니다.

#은 인수를 문자열 리터럴로 변환하는 단항 연산자입니다.

##은 2 개의 토큰을 붙여서 하나의 단일 토큰을 형성하는 2 항 연산자입니다.

주어진 전처리 기 코드가 확장되는 것을 확인하는 가장 쉬운 방법은 실제로 전 처리기를 실행하는 것입니다. g++ 컴파일러에는 정확히 수행 할 수있는 -E 옵션이 있습니다.

# Assuming your file is saved as code.cpp 
$ g++ -E code.cpp 
... lots of output ... 
int main() 
{ 
    std::cout<<"\"hello\""<<std::endl; 
    return 0; 
}