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.


Bagaimana Anda mencoba menggunakan ini?
chris

Jawaban:



28

Anda ingin menggunakan operator merangkai:

#define STRING(s) #s

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

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";

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

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.