Как использовать аргумент макроса в качестве строкового литерала?


Я пытаюсь выяснить, как написать макрос, который будет передавать как строковое литеральное представление имени переменной вместе с самой переменной в функцию.

например, учитывая следующую функцию.

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

Я хотел бы написать макрос, чтобы я мог сделать это:

int my_val = 5;
CALL_DO_SOMETHING(my_val);

что бы распечатать: my_val: 5

Я попытался сделать следующее:

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

однако, как вы можете догадаться, VAR внутри кавычек не заменяется, а просто передается как строковый литерал "VAR". Поэтому я хотел бы знать, есть ли способ превратить аргумент макроса в сам строковый литерал.

4 61

4 ответа:

использовать препроцессор # оператор:

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

вы хотите использовать строковый оператор:

#define STRING(s) #s

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

возможно, вы попробуете это решение:

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