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

Результат - "привет". разместите ссылку wesite. – sujin

+0

это китайский сайт. в конце сайта http://hi.baidu.com/feixue/item/b22cdca63f778417a9cfb729 – user2701639

ответ

0

Прежде всего, нет рекурсивного макроса.

Большинство работ в этом примере выполняются двумя операторами препроцессора # и ##.

# - унарный оператор, который превращает свой аргумент в строковый литерал.

## - это двоичный оператор, который вставляет два токена вместе, образуя один единственный токен.

Самый простой способ проверить, что данный код препроцессора расширяется, - это фактически запустить препроцессор. Компилятор 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; 
} 
Смежные вопросы