2010-11-26 18 views
5

Makro tanımlanmış, ancak boş (herhangi bir değer içermiyor) olduğunu doğrulamak için bir kod yazmam gerekiyor. Testin derlenme zamanında olması gerekmez.C makro değeri boş olup olmadığını test edin

yazmaya çalışılıyor:

#if (funcprototype == "") 
MY_WARN("funcprototype is empty"); 
#endif 

kod derleme değil, funcprototype boş genişler olarak.

+0

Testin derleme zamanı testi olması gerekmez, ancak sonucu "# if" yönergesinde kullanmak istersiniz? Ne 'funcprototype' boş olmayan bir yedek listeye sahipse, ancak değiştirdikten sonra hiçbir şey yapılmazsa (yeniden taramaya bağlı olarak). –

+0

Bu, http://stackoverflow.com/questions/4102351/test-for-empty-macro-definition –

cevap

5

bir çalışma zamanı kontrol tamamdır, o zaman stringized değiştirme uzunluğunu test edebilirsiniz: Genel bir durum "olduğunu sanmıyorum

#define REAL_STRINGIZE(x) #x 
#define STRINGIZE(x) REAL_STRINGIZE(x) 

if (STRINGIZE(funcprototype)[0] == '\0') { 
    // funcprototype expanded to an empty replacement list 
} 
else { 
    // funcprototype expanded to a non-empty replacement list 
} 

boş yerini bu makrodur token dizisi "derleme zamanı denetimi. Bu benzer bir sorundur "derleme için iki dizi belirteçleri eşitlemek mümkündür," derleme zamanında yapmak imkansız.

+1

'un bir kopyası gibi görünmektedir; bu, jeton sekansı hakkında neyin varsayılabileceğine bağlıdır. bakınız örn. [bu saçma makro] (http://alfps.wordpress.com/2010/05/06/cppx-a-simple-unit-tests-framework/) benim. ** hark ** (anticipiating apaçık soru) çok özel bir amaç için yapıldı –

+1

Visual Studio'da çalışmak için, "STRINGIZE (x)", '# x' olarak tanımlanmalıdır, aksi takdirde "REAL_STRINGIZE" ifadesi kullanılmalıdır. 'x' boş bir makro ise (" yeterli argüman "hatasıyla sonuçlanır) makro başarısız olur. Makro, bunun gibi iki düzeyde bir sebebi var mı? Bunu daha önce görmüştüm ama neden böyle bir açıklama yapmadı? –

+0

Nevermind, cevabımı burada buldu: http://gcc.gnu.org/onlinedocs/cpp/Argument-Prescan.html#Argument-Prescan. Onu yararlı bulabilecek herkes için burada bırakmak. –

İlgili konular