Saya tahu bahwa ini masih lama setelah kueri asli, tetapi ini mungkin masih berguna.
Ini dapat dilakukan di GCC menggunakan operator stringify "#", tetapi memerlukan dua tahap.
#define XSTR(x) STR(x)
#define STR(x) #x
Nilai makro kemudian dapat ditampilkan dengan:
#pragma message "The value of ABC: " XSTR(ABC)
Lihat: 3.4 Stringifikasi dalam dokumentasi online gcc.
Bagaimana itu bekerja:
Praprosesor memahami string yang dikutip dan menanganinya secara berbeda dari teks normal. Rangkaian string adalah contoh dari perlakuan khusus ini. Pragma pesan membutuhkan argumen yang berupa string yang dikutip. Jika ada lebih dari satu komponen ke argumen maka semuanya harus berupa string sehingga penggabungan string dapat diterapkan. Praprosesor tidak pernah dapat berasumsi bahwa string tanpa tanda kutip harus diperlakukan seolah-olah dikutip. Jika ya maka:
#define ABC 123
int n = ABC;
tidak akan dikompilasi.
Sekarang pertimbangkan:
#define ABC abc
#pragma message "The value of ABC is: " ABC
yang setara dengan
#pragma message "The value of ABC is: " abc
Ini menyebabkan peringatan preprocessor karena abc (unquoted) tidak dapat digabungkan dengan string sebelumnya.
Sekarang perhatikan preprocessor stringize (Yang pernah disebut stringifikasi, link dalam dokumentasi telah diubah untuk mencerminkan terminologi yang direvisi. (Kedua istilah tersebut, kebetulan, sama-sama menjijikkan. Istilah yang benar, tentu saja, stringifaction. Bersiaplah untuk memperbarui tautan Anda.)). Ini hanya bertindak pada argumen makro dan menggantikan argumen yang tidak diperluas dengan argumen yang diapit tanda kutip ganda. Jadi:
#define STR(x) #x
char *s1 = "abc";
char *s2 = STR(abc);
akan memberikan nilai yang identik ke s1 dan s2. Jika Anda menjalankan gcc -E, Anda dapat melihat ini di keluaran. Mungkin STR akan lebih baik diberi nama seperti ENQUOTE.
Ini memecahkan masalah menempatkan kutipan di sekitar item yang tidak dikutip, masalahnya sekarang adalah, jika argumennya adalah makro, makro tidak akan diperluas. Inilah mengapa makro kedua dibutuhkan. XSTR memperluas argumennya, lalu memanggil STR untuk memasukkan nilai yang diperluas ke dalam tanda kutip.