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.
Jawaban:
Gunakan
#
operator preprocessor :#define CALL_DO_SOMETHING(VAR) do_something(#VAR, VAR);
sumber
Anda ingin menggunakan operator merangkai:
#define STRING(s) #s int main() { const char * cstr = STRING(abc); //cstr == "abc" }
sumber
Mungkin Anda mencoba solusi ini:
#define QUANTIDISCHI 6 #define QUDI(x) #x #define QUdi(x) QUDI(x) . . . . . . unsigned char TheNumber[] = "QUANTIDISCHI = " QUdi(QUANTIDISCHI) "\n";
sumber
QUDI(x)
tidak cukup.#define NAME(x) printf("Hello " #x); main(){ NAME(Ian) } //will print: Hello Ian
sumber
"Hello" #x"
(dan#x "Hello"
) menyebabkan string direkatkan tanpa spasi, yang diinginkan dalam beberapa kasus, jadi ini jawaban yang cukup bagus."Hello " #x