Dize haline getirme işleci (#)
Sayı işareti veya "dizeleme" işleci (#), parametre tanımını genişletmeden makro parametrelerini dize değişmez değerlerine dönüştürür. Yalnızca bağımsız değişken alan makrolarla kullanılır. Makro tanımında biçimsel bir parametreden önce gelirse, makro çağrısı tarafından geçirilen gerçek bağımsız değişken tırnak işaretleri içine alınır ve dize sabit değeri olarak değerlendirilir. Daha sonra dize sabit değeri, dize haline getirme işleci ile biçimsel parametrenin makro tanımındaki her birleşim örneğini değiştirir.
Not
ANSI C standardının önceden dize sabit değerleri ve karakter sabitleri içinde görünen makro biçimsel bağımsız değişkenlerini genişleten Microsoft C (6.0 ve önceki sürümleri) uzantısı, artık desteklenmemektedir. Bu uzantıyı kullanan kod dizeleme (#) işleci kullanılarak yeniden yazılmalıdır.
İlk belirtecin önüne geçen ve gerçek bağımsız değişkenin son belirtecini izleyen boşluk yoksayılır. Gerçek bağımsız değişkendeki belirteçler arasında yer alan boşluklar, ortaya çıkan dize sabit değerinde tek bir boşluk olarak azaltılır. Bu nedenle, gerçek bağımsız değişkende iki belirteç arasında bir açıklama oluşursa, tek bir boşluk olur. Sonuçta elde edilen dize değişmez değeri, yalnızca boşlukla ayrılmış tüm bitişik dize değişmez değerleriyle otomatik olarak birleştirilir.
Ayrıca, bağımsız değişkende bulunan bir karakter genellikle dize değişmez değeri içinde kullanıldığında bir kaçış dizisi gerektiriyorsa( örneğin, tırnak işareti ("
) veya ters eğik çizgi (\
) karakteri, gerekli kaçış ters eğik çizgi karakterin önüne otomatik olarak eklenir.
Microsoft C++ dizeleme işleci, kaçış dizileri içeren dizelerle kullanıldığında doğru şekilde davranmaz. Bu durumda, derleyici Derleyici Hatası C2017 oluşturur.
Örnekler
Aşağıdaki örnekte dize işlecini içeren bir makro tanımı ve makroyu çağıran bir ana işlev gösterilmektedir:
// 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" );
}
Makrolar stringer
ön işleme sırasında genişletilir ve aşağıdaki kod oluşturulur:
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"
Aşağıdaki örnekte, bir makro parametresini nasıl genişletebileceğiniz gösterilmektedir:
// 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)