2010-03-11 20 views
29

C ürününde makro gibi bir şey yapabilir misiniz?C önişlemci Makro tanımlama Makroyu

#define SUPERMACRO(X,Y) #define X Y 

then 

SUPERMACRO(A,B) expands to #define A B 

Önişlemcinin yalnızca bir tanesini geçmemesi nedeniyle bir şey hissediyorum.

Yalnızca resmi gcc. Üçüncü taraf araçları yok lütfen.

cevap

23

Makrolar, önişleme direktiflerine genişletilemez. C99 6.10.3.4/3 "yeniden taranması ve daha fazla değiştirme" kaynaktan:

elde edilen tamamen makro ikame o birine benzer bile ön işleme komutu olarak işlenmez belirteç dizisini ön işlenmesi,

2

Üzgünüz, yapamazsınız. Makrolarda diğer makroları arayabilir, ancak yenilerini tanımlayamazsınız.

+0

Ön işlemcinin 2 geçişini – pm100

+1

yapıp yapmadığınızı öğrenin. Sözdizimi geçerli değil. # Makrolarda ayrılmış bir karakter türüdür. # Geçerli olması için bir makro parametresi takip edilmelidir. Bu, parametreyi 'dizilecek'. –

3

No. İşlem sırası, tüm önişlemci yönergeleri, herhangi bir makro genişletme yapılmadan önce tanınır; Dolayısıyla, bir makro bir önişlemci yönergesi gibi görünen bir şeye genişlerse, bu şekilde tanınmaz, ancak (hatalı) C kaynak metni olarak yorumlanmayacaktır.

12

Makroları diğer makrolarda tanımlayamazsınız, ancak makrodan makroları çağırabilirsiniz, bu da size temelde aynı sonuçları verebilir.

#define B(x) do {printf("%d", (x)) }while(0) 
#define A(x) B(x) 

yüzden, A(y)do {printf("%d", (y)) }while(0)

0

Ardından Önişlenmiş dosyayla derleme, sadece preprocess seçeneği ile çalışan deneyebilirsiniz için genişletilir.

0

Gerçi bu yapacağım: #define Süper makro (X, Y) X, Y

Sonra eksik # da editörler makro genişleme işlevini kullanmak ve yapıştırabilirsiniz tanımlar.

Veya daha da iyisi: Önişlemciniz olarak farklı, daha güçlü bir dizgi işleme dili kullanın.