2012-12-12 21 views
9

++ önişlemci. Bu çirkin, ancak yapılandırma dosyası bunlardan birçoğunu içeriyor ve şimdi değiştirmek zor olacaktı.bölme bağımsız değişkenleri üzerinde çalışıyorum bazı eski kod işlev parametresi olarak kullanılması amaçlanan bir virgülle ayrılmış bir listesini veren bir makro olup

#define XY1 0,0 
#define XY2 1,7 
... 

void fun_point(x,y); 

fun_point(XY1); 

Bu, çağrılan bir işlev olduğu sürece iyi çalışır. parametrelerle başka makro çağırmak çalışırken Ancak, tüm dize iki argüman

#define MAC_POINT(x,y) (x+y) 
MAC_POINT(XY1) #not expanded by preprocessor 

XY tanımları değiştirmeden bu sorun için bir çözüm var mı

içine virgül az bir argüman yerine bölünmüş olarak kabul edilir? Kinda

+2

/me eski kodda yumruk atıyor – icabod

+1

GCC el kitabında bir tartışma veya bu sorun bulundu: http://gcc.gnu.org/onlinedocs/cpp/Argument-Prescan.html#Argument-Prescan – Quantum7

cevap

13

. Aşağıdaki işler:

#define MAC_POINT(x,y) (x+y) 
#define MAC_POINT1(xy) MAC_POINT(xy) 
#define XY x,y 
MAC_POINT(x,y) 
MAC_POINT1(XY) 

Ancak, sadece bir argüman varsa MAC_POINT1 için MAC_POINT değiştirmek zorundayız.

başka olasılık

şudur:

#define MAC_POINT(x,y) (x+y) 
#define MAC_POINT1(xy) MAC_POINT xy 
#define XY x,y 
MAC_POINT1((x,y)) 
MAC_POINT1((XY)) 

Şimdi makro için tüm aramaları değiştirmek zorunda, ama en azından onlar tutarlı konum.

+0

Ah, I Ekstra indirmenin neden gerekli olduğunu düşünüyorum. Teşekkürler! – Quantum7