2010-08-05 32 views
39

Makro genişletme sonucunu belirlemek istiyorum.C Önişlemci, Makro sonucunu dizge haline getirme

#define QUOTE(str) #str 
#define TEST thisisatest 
#define TESTE QUOTE(TEST) 

Ve TESTE şekilde genişletilmiştir alır:

aşağıdaki ile denedim ben "ThisIsATest" almaya çalışıyorum ederken, "TEST". Bunun, ön işlemcinin doğru davranışı olduğunu biliyorum, ancak biri diğerini elde etmenin bir yolu ile bana yardımcı olabilir mi? Bunun gibi

Using TESTE #TEST is not valid 
Using TESTE QUOTE(thisisatest) is not what I'm trying to do 
+1

http://stackoverflow.com/questions/798221/c-macros-to-create-strings –

cevap

68

:

#include <stdio.h> 

#define QUOTE(str) #str 
#define EXPAND_AND_QUOTE(str) QUOTE(str) 
#define TEST thisisatest 
#define TESTE EXPAND_AND_QUOTE(TEST) 

int main() { 
    printf(TESTE); 
} 

nedeni makro argümanlar makro vücuda ikame edildiğinde, onlar bu makro # veya ## önişlemci operatörleri ile görünür sürece genişletilmiş olmasıdır . Yani, str (kodunuzda TEST değeriyle) QUOTE'da genişletilmemiş, ancak EXPAND_AND_QUOTE'da genişletilmiştir.

+0

1 Teşekkür çok: D – almosnow

13

Biraz daha açıklığa kavuşturmak için, esas olarak önişlemci başka bir "aşama" yürütmek için yapılmıştır. yani:

1 vaka:

->TESTE 
->QUOTE(TEST) # preprocessor encounters QUOTE 
# first so it expands it *without expanding its argument* 
# as the '#' symbol is used 
->TEST 

2 vaka:

->TESTE 
->EXPAND_AND_QUOTE(TEST) 
->QUOTE(thisisatest) 
    # after expanding EXPAND_AND_QUOTE 
    # in the previous line 
    # the preprocessor checked for more macros 
    # to expand, it found TEST and expanded it 
    # to 'thisisatest' 
->thisisatest