2013-01-16 9 views

cevap

29

Bu bağlamda (bir makro tanımında bir parametre referansına uygulanır), pound işareti, bu parametreyi, makroya iletilen argümanın metinsel metnine genişletmek anlamına gelir.

Bu durumda, PRINT(5)'u çağırırsanız, makro genişlemesi 5 5 yazdıracak printf("5" "%d\n", 5);; çok kullanışlı değil; Ancak, PRINT(5+5) numaralı telefonu çağırırsanız, makro genişletme olur ve 5+5 10, biraz daha az önemsizdir.

Bu örnek, this tutorial on the C preprocessor (c macro pound sign için ilk Google isabetidir) açıklanmıştır.

+0

bu gcc özelliği veya ANSi C standardıdır? –

+2

@AndersLind: Bu standart bir davranıştır. # # Operatörünün semantik ayrıntılarını veren §6.10.3.2/2'ye bakın. – dreamlax

+0

@dreamlax vay, teşekkürler. Programlama hayatımda asla kullanmam 10 yıl ... kahretsin! .. ben çoğu zaman C++ programlıyorum –

4

Makro parametresi için kötü bir ad seçimi, ancak zararsız (teşekkürler dreamlax).

çok

PRINT(5); 

Bu

printf("5" "%d\n",5); 

veya

printf("5 %d\n",5); 

olarak değiştirilecektir gibi bilgileri Temel olarak eğer Stringification olarak adlandırılan bir süreç, #int bir değiştirilir içeriğinden oluşan dize, 5 -> "5"

+1

Makro ön yordamlar tarafından genişletilmiştir. C tipi sistem hakkında bilgisi olmayan sorgular. Bildiğim kadarıyla, “§”, §6.10'da (Önişlem Direktifleri) herhangi bir kuralı ihlal etmiyor, ama kabul ediyorum ki bu kötü bir seçim. – dreamlax

+0

Dize belgesiyle ilgili bağlantınız kesildi, lütfen güncelleyin. – DeathByTensors

+1

@DrewBuckley sabit! –

9

"#", bu şekilde makro tanımlamak daha iyidir bir değişkenin adını gösterebilir:

#define PRINT(i) printf(#i "= %d\n", i) 

ve bu gibi kullanmak:

int i = 5; 
PRINT(i); 

Sonucu gösterilen:

i = 5 
İlgili konular