2010-06-21 17 views
8

varsayalım Aşağıdaki makro: Adını değiştirmeden Bu makro bir "gelişmiş" sürümünü kullanmak istediğiniz belirli dosyaları ŞimdiNasıl önceki tanımını kullanarak bir makro yeniden tanımlamak için

#define xxx(x) printf("%s\n",x); 

. Yeni sürüm, orijinal sürümün işlevselliğini araştırıyor ve biraz daha fazla iş yapıyor.

#define xxx(x) do { xxx(x); yyy(x); } while(0) 

Bu tabii bana redefition uyarı verir ama olsun neden 'xxx' Bu kapsamda beyan edilmedi? Nasıl düzgün tanımlamalıyım?

DÜZENLEME: Bu http://gcc.gnu.org/onlinedocs/gcc-3.3.6/cpp/Self_002dReferential-Macros.html göre o Size soran tam olarak ne değil ama yardımcı olabilir

+1

O Makro değişiminin sonsuz yinelenmesini önleme. Bir makroyu birden fazla şey anlamına gelebilecek şekilde tanımlayabileceğiniz anlamına gelmez. –

cevap

0

mümkün olmalıdır.

Yeni bir tanım vermeden önce makroda #undef bir makro oluşturabilirsiniz.

Örnek:

#ifdef xxx 
#undef xxx 
#endif 
#define xxx(x) whatever 

ben duymadım (veya görülen) asla olsa özyinelemeli makro. Bunun mümkün olduğunu düşünmüyorum.

+2

'# ifdef' bloğunun gerekli olmadığını unutmayın. Bir ad üzerinde makro olmayan bir makro olarak tanımlanmasa bile, bir ad olarak 'undef' kullanamazsınız. Yani, sadece #undef xxx' ve sonra #define xxx ... 'olabilir. –

+0

@James McNellis: Bilinmesi güzel. Teşekkürler! – ereOn

6

mümkün değil. Makrolar diğer makroları kullanabilir ancak tanım zamanında değil, genişletilmiş zamanda kullanılabilen tanımı kullanıyorlar. Ve C ve C++'daki makrolar yinelenemez, bu nedenle yeni makronuzdaki xxx genişletilmez ve bir işlev olarak kabul edilir.

3

Makroların eski tanımını yeniden kullanamazsınız, ancak bunu tanımlayamaz ve yeni tanımı yapabilirsiniz. Umarım kopyalayıp yapıştırmak için fazla karmaşık değildir.

#ifdef xxx 
#undef xxx 
#endif 
#define xxx(x) printf("%s\n",x); 

Benim önerim, bir xxx2 makrosunu tanımlamaktır.

#define xxx2(x) do { xxx(x); yyy(x); } while(0); 
+3

'# ifdef' bloğunun gerekli olmadığını unutmayın. Bir ad üzerinde makro olmayan bir makro olarak tanımlanmasa bile, bir ad olarak 'undef' kullanamazsınız. Yani, sadece #undef xxx' ve sonra #define xxx ... 'olabilir. –

+0

Cool! Bunu bilmiyordum. '# Ifdef' bırakarak kodu daha okunabilir hale getirir. Uygulamalarıma uygulama için ortak olan varsayılan ayarlayın ve sonra değiştirmek şeyler için uygulamayı belirli Prefix.pch en sahip olduğu – Mike

+0

Bir Proje Prefix.pch var. Bir makroyu yeniden tanımladığımda ve bu uyarıyı işlemcinin önünden nasıl açacağımı anlayamadığımda 'Lexical veya Preprocessor Issue makrosu yeniden tanımlandı' uyarısını alıyordum. #UNUM PLAY_BUTTON_TITLE ve #define PLAY_BUTTON_TITLE @ "Başlat" hatayı kaldırarak düğmeye basar ve düğmeyi yeniden tanımlar. – JScarry

2

'xxx' makrosunda 'x' parametresi türünü biliyorsanız, makroyu bir işlevde kullanarak yeniden tanımlayabiliriz ve sonra 'xxx' makrosunu bu işlev olarak tanımlayabiliriz

'xxx' makro için

Orjinal tanım:

#define xxx(x) printf("xxx %s\n",x); 

'xxx' makro belirli bir dosya yapmak geliştirilmiş versiyonunda: özüne makro sayfası kurallarını anlatıyor

/* before redefining the "xxx" macro use it in function 
* that will have enhanced version for "xxx" 
*/ 
static inline void __body_xxx(const char *x) 
{ 
    xxx(x); 
    printf("enhanced version\n"); 
} 

#undef xxx 
#define xxx(x) __body_xxx(x) 
İlgili konular