Operator stringizing (#)
Operator tanda angka atau "stringizing" (#) mengonversi parameter makro menjadi string literal tanpa memperluas definisi parameter. Ini hanya digunakan dengan makro yang mengambil argumen. Jika mendahului parameter formal dalam definisi makro, argumen aktual yang diteruskan oleh pemanggilan makro diapit dalam tanda kutip dan diperlakukan sebagai string literal. String literal kemudian menggantikan setiap kemunculan kombinasi operator stringizing dan parameter formal dalam definisi makro.
Catatan
Ekstensi Microsoft C (versi 6.0 dan yang lebih lama) ke standar ANSI C yang sebelumnya memperluas argumen formal makro yang muncul di dalam literal string dan konstanta karakter tidak lagi didukung. Kode yang bergantung pada ekstensi ini harus ditulis ulang menggunakan operator stringizing (#).
Spasi kosong yang mendahului token pertama dan mengikuti token terakhir dari argumen aktual diabaikan. Spasi kosong antara token dalam argumen aktual dikurangi menjadi spasi kosong tunggal dalam string yang dihasilkan secara harfiah. Dengan demikian, jika komentar terjadi antara dua token dalam argumen aktual, komentar akan dikurangi menjadi spasi kosong tunggal. Literal string yang dihasilkan secara otomatis digabungkan dengan literal string yang berdekatan yang hanya dipisahkan oleh spasi kosong.
Selanjutnya, jika karakter yang terkandung dalam argumen biasanya memerlukan urutan escape saat digunakan dalam string literal, misalnya, tanda kutip ("
) atau karakter garis miring terbalik (\
), garis miring terbalik yang diperlukan secara otomatis dimasukkan sebelum karakter.
Operator stringizing Microsoft C++ tidak berulah dengan benar saat digunakan dengan string yang menyertakan urutan escape. Dalam situasi ini, compiler menghasilkan Compiler Error C2017.
Contoh
Contoh berikut menunjukkan definisi makro yang menyertakan operator stringizing, dan fungsi utama yang memanggil makro:
// stringizer.cpp
#include <stdio.h>
#define stringer( x ) printf_s( #x "\n" )
int main() {
stringer( In quotes in the printf function call );
stringer( "In quotes when printed to the screen" );
stringer( "This: \" prints an escaped double quote" );
}
stringer
Makro diperluas selama praproses, menghasilkan kode berikut:
int main() {
printf_s( "In quotes in the printf function call" "\n" );
printf_s( "\"In quotes when printed to the screen\"" "\n" );
printf_s( "\"This: \\\" prints an escaped double quote\"" "\n" );
}
In quotes in the printf function call
"In quotes when printed to the screen"
"This: \" prints an escaped double quote"
Contoh berikut menunjukkan bagaimana Anda dapat memperluas parameter makro:
// stringizer_2.cpp
// compile with: /E
#define F abc
#define B def
#define FB(arg) #arg
#define FB1(arg) FB(arg)
FB(F B)
FB1(F B)