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.)
Teşekkür: Eğer sadece 2 belirteçleri (bir tanımlayıcı ve bir geçersiz jetonu) alacağı
##
kullanırsanızfoo . bar
:foo.bar
3 jeton (iki tanımlayıcılar ve operatör) olarak çözümlenen. – Jack"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
@Michael Evet, bu yanlış. –