Bagaimana cara menggunakan argumen Makro sebagai string literal?

91

Saya mencoba mencari cara untuk menulis makro yang akan melewatkan representasi literal string dari nama variabel bersama dengan variabel itu sendiri ke dalam suatu fungsi.

Misalnya diberikan fungsi berikut.

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

Saya ingin menulis makro sehingga saya bisa melakukan ini:

int my_val = 5;
CALL_DO_SOMETHING(my_val);

Yang akan mencetak: my_val: 5

Saya mencoba melakukan hal berikut:

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

Namun, seperti yang Anda duga, VAR di dalam tanda kutip tidak diganti, tetapi hanya diteruskan sebagai string literal "VAR". Jadi saya ingin tahu apakah ada cara agar argumen makro diubah menjadi string literal itu sendiri.

Ian
sumber
Bagaimana Anda mencoba menggunakan ini?
chris

Jawaban:

145

Gunakan #operator preprocessor :

#define CALL_DO_SOMETHING(VAR) do_something(#VAR, VAR);
Morwenn
sumber
28

Anda ingin menggunakan operator merangkai:

#define STRING(s) #s

int main()
{
    const char * cstr = STRING(abc); //cstr == "abc"
}
chris
sumber
9

Mungkin Anda mencoba solusi ini:

#define QUANTIDISCHI 6
#define QUDI(x) #x
#define QUdi(x) QUDI(x)
. . . 
. . .
unsigned char TheNumber[] = "QUANTIDISCHI = " QUdi(QUANTIDISCHI) "\n";
Zili
sumber
Bagaimana ini menjawab pertanyaan atau bagaimana itu membantu?
jirigracik
1
@jirigracik - Ini memungkinkan untuk mendapatkan presentasi string ekspansi makro juga, tidak seperti jawaban lain
grepcake
3
Saya pikir akan berguna untuk menjelaskan mengapa hanya saja QUDI(x)tidak cukup.
LRDPRDX
8
#define NAME(x) printf("Hello " #x);
main(){
    NAME(Ian)
}
//will print: Hello Ian
Mikele Shtembari
sumber
Saya tidak sepenuhnya yakin, tetapi sepertinya "Hello" #x"(dan #x "Hello") menyebabkan string direkatkan tanpa spasi, yang diinginkan dalam beberapa kasus, jadi ini jawaban yang cukup bagus.
Smar
1
@Smar Pastikan Anda memberi spasi setelah string konstan Halo: "Hello " #x
jack
Oke, saya pikir begitu, Anda juga harus mengeditnya pada jawaban Anda karena ini adalah informasi yang berharga :)
Smar