2012-04-10 26 views
5

Ben şu soruyu okudum ve cevap yeterince açık görünüyor: DEĞİŞKEN sonuna nokta vardır How to concatenate twice with the C preprocessor and expand a macro as in "arg ## _ ## MACRO"?Dizeleri C önişlemcisiyle noktalarla birleştirmek nasıl?

Ama ne olur?

Sayaçları hata ayıklama amacıyla yapılandıran basit bir makro yapmaya çalışıyorum. Ben bile kolayca basitçe

#ifdef DEBUG 
#define DEBUG_INC_COUNTER(x) x++ 
#endif 

ile yukarıdaki soruya yardım almadan bunu yapmak ve bunu

DEBUG_INC_COUNT(debugObj.var1); 

Ama ekleyerek çağırabilirsiniz "debugObj." her makro için çok fazla gereksiz görünüyor. Ancak bitiştirmek çalışırsanız:

#define VARIABLE debugObj. 
#define PASTER(x,y) x ## y++ 
#define EVALUATOR(x,y) PASTER(x,y) 
#define DEBUG_INC_COUNTER(x) EVALUATOR(VARIABLE, x) 
DEBUG_INC_COUNTER(var) 

gcc -E macro.c 

Ben

macro.c:6:1: error: pasting "." and "var" does not give a valid preprocessing token 

Peki nasıl değiştirmeliyim olsun bu yüzden

DEBUG_INC_COUNTER(var); 

debugObj.var++; 

oluşturduğu?

cevap

5

atlarsanız ##; Bu sadece dizeleri birleştirmek istiyorsanız gereklidir. Argümanlar dizeler olmadığından, aralarındaki boşluklar önemli değildir (debugObj . var1, debugObj.var1 ile aynıdır).

+0

D'oh! Orada çok zekiyim. – Makis

4

ayrı önişlemci simgeleri olarak debugObj. ve var1 olabilir gibi, birlikte ## kullanarak yapıştırın olmamalıdır.

şu çalışması gerekir:

#define DEBUG_INC_COUNTER(x) debugObj.x++ 
+0

Düzenlemede cevabınız temizlenince, Aaron'un cevabı başlangıçta benim için daha açıktı ve düzenlemenizi görmeden önce kabul ettim. – Makis

+0

Benimle iyi ... İyi şanslar! – Lindydancer

İlgili konular