2012-05-08 24 views
55

Próbuję dowiedzieć się, jak napisać makro, które przekaże zarówno funkcję literową nazwę zmiennej wraz z samą zmienną do funkcji.Jak używać argumentu Makro jako literału ciągu?

Na przykład z następującą funkcją.

void do_something(string name, int val) 
{ 
    cout << name << ": " << val << endl; 
} 

chciałbym napisać makro, więc mogę to zrobić:

int my_val = 5; 
CALL_DO_SOMETHING(my_val); 

Które wydrukować: my_val: 5

Próbowałem następujący sposób:

#define CALL_DO_SOMETHING(VAR) do_something("VAR", VAR); 

Jednak, jak można się domyślić, VAR wewnątrz cytatów nie zostaje zastąpiony, ale jest przekazywany jako ciąg dosłowny "VAR". Chciałbym się więc dowiedzieć, czy istnieje sposób na przekształcenie argumentu makr w literał łańcuchowy.

+0

Jak starasz korzystać z tego? – chris

Odpowiedz

92

pomocą preprocesora # operator:

#define CALL_DO_SOMETHING(VAR) do_something(#VAR, VAR); 
22

chcesz użyć operatora stringizing:

#define STRING(s) #s 

int main() 
{ 
    const char * cstr = STRING(abc); //cstr == "abc" 
} 
5
#define NAME(x) printf("Hello " #x); 
main(){ 
    NAME(Ian) 
} 
//will print: Hello Ian 
+0

Nie jestem całkowicie pewien, ale wygląda na to, że "Cześć" #x "' (i "#x" Witaj "') powoduje, że ciąg jest sklejony ze sobą bez spacji, co jest pożądane w niektórych przypadkach, więc to jest dość dobra odpowiedź: – Smar

+0

@Smar Upewnij się, że wstawisz spację po stałym ciągu Hello: '" Hello "# x' – jack

+0

OK Myślałem, że tak, powinieneś edytować to również w odpowiedzi, ponieważ jest to cenna informacja :) – Smar

0

Być może spróbować tego rozwiązania:

#define QUANTIDISCHI 6 
#define QUDI(x) #x 
#define QUdi(x) QUDI(x) 
. . . 
. . . 
unsigned char TheNumber[] = "QUANTIDISCHI = " QUdi(QUANTIDISCHI) "\n"; 
Powiązane problemy