2012-11-04 18 views
25

X makroyu uyguluyor ancak basit bir makro genişletme ile ilgili bir sorunum var. Bu makro (aşağıya bakınız), this makalesine ekleyerek çeşitli makro kullanım örneklerinde kullanılır. Derleyici bir hata iletisi veriyor, ancak GCC derleyicisiyle -E bayrağını kullanarak geçerli bir C kodu görebiliyorum.hata: "." Yapıştırılıyor ve "kırmızı" geçerli bir ön işlem belirteci vermiyor

makro X-liste olarak tanımlanır aşağıdadır:

#define LIST \ 
    X(red, "red") \ 
    X(blue, "blue") \ 
    X(yellow, "yellow") 

Ve sonra:

#define X(a, b) foo.##a = -1; 
    LIST; 
#undef X 

Ama verilen gcc Aşağıdaki hatalar mesajlar: I gibi

lixo.c:42:1: error: pasting "." and "red" does not give a valid preprocessing token 
lixo.c:42:1: error: pasting "." and "blue" does not give a valid preprocessing token 
lixo.c:42:1: error: pasting "." and "yellow" does not give a valid preprocessing token 

dediğim gibi, geçerli C kodunu -E gcc:

lixo.c:42:1: error: pasting "." and "red" does not give a valid preprocessing token 
lixo.c:42:1: error: pasting "." and "blue" does not give a valid preprocessing token 
lixo.c:42:1: error: pasting "." and "yellow" does not give a valid preprocessing token 
    foo.red = -1; foo.blue = -1; foo.yellow = -1;; 

Geçerli bir önişleme belirteci nedir? Birisi bunu açıklayabilir mi?

(siz söylemeden önce "neden sadece bir ya başlatmak ya da değil memset()?" Yerine gerçek kod değil.)

cevap

36

. belirteçleri ayırır ve böylece .red olarak ## geçerli bir belirteç değildir kullanamaz. İki jetonu tek bir dizide birleştiriyorsanız, yalnızca ## kullanırsınız.

Bu çalışır:

#define X(a, b) foo.a = -1; 

What's a valid proprocessing token? Can someone explain this?

O/ayrıştırıldı lexed alır budur. Çok foo .bar

+0

Teşekkür: Eğer sadece 2 belirteçleri (bir tanımlayıcı ve bir geçersiz jetonu) alacağı ## kullanırsanız foo . bar: foo.bar 3 jeton (iki tanımlayıcılar ve operatör) olarak çözümlenen. – Jack

+5

"Bu makalede" (http://www.cprogramming.com/tutorial/cpreprocessor.html) bölümünde "Yapıştırıcı belirteçleri" bölümü yanlış mı? – Michael

+5

@Michael Evet, bu yanlış. –

İlgili konular