Biz sadece genişletmek zorundayız makro. Sadece önişlemciyi çağırmak için gcc -E
'u kullanabilirsiniz; Ayrıca tüm #include
yönergelerini genişletecek, böylece çıktı çirkin olacak.
Ama el ile yapalım. Makro argümanları, ifade değil, token dizileridir.
# define _2a(list,a1,a2) list a1;a2;
ve çağırma geçerli::
makro tanımıdır
main _2a((argc,argv), int argc, char * argv[])
{
...
}
argümanları şunlardır:
list
->(argc,argv)
a1
->Bu daha yaygın birden fazla satır üzerinde yazılı olacak main (argc,argv) int argc; char * argv[];
{
...
}
:
main(argc, argv)
int argc;
char *argv[];
{
...
}
Bu eski bir olduğunu -
a2
yedek Sahne>char * argv[]
bize verdiği -style işlev bildirimi.C'nin tüm versiyonlarında (2011 standardına kadar olan) hala yasaldır, ancak 1989'dan beri resmen demode olmuştur. Bu eski formun dezavantajı, parametre bilgilerini arayanlara iletmemesidir, bu yüzden bir derleyici Yanlış sayıda argüman türüyle bir işlevi çağırırsanız sizi uyarın.
Ben bir prototip içerir daha modern tanımını genişletiyor
_a2
makro alternatif bir tanımı olmasa bahse girerim
, gibi bir şey : O makro tanımı ile
#define _2a(list,a1,a2) (a1, a2)
, main
tanımı yerine bu şekilde genişler :
main (int argc, char * argv[])
{
...
}
Yani _a2
("a" muhtemelen "argümanı" anlamına gelir) Eğer genişletebilirsiniz kod yazmak sağlayan makro ya, eski tip bir işlev tanımına (ANSI öncesi derleyiciler için) veya bir prototiple modern bir tanıma.
o olurdu uygulamak için makul bir yol:
#ifdef __STDC__
#define _2a(list,a1,a2) (a1, a2)
#else
#define _2a(list,a1,a2) list a1;a2;
#endif
Ama prototip desteklemeyen bir C derleyicisi bulmak çok olası konum beri (onlar dilin standart bir özelliktir oldum Şimdi bir çeyrek asırdır), sadece makronun tamamen kaldırılması ve sadece modern tarzdaki fonksiyon açıklamaları ve tanımlarını kullanması daha mantıklı olacaktır. Ayrıca, main
tanımının int
dönüş türünde eksik olduğu belirtilmiştir. 1999 C standardından önce, "örtülü int
" kuralı altında dönüş türünü atlamak yasaldı. 1999 standardı bu kuralı düşürdü ve açık bir dönüş türü zorunlu kıldı. Çoğu C derleyicisi, varsayılan modlarında hala bir uyarı ile geri dönüş türünün atlanmasına izin verir, ancak atlamak için iyi bir neden yoktur.
'_2a', büyük olasılıkla bazı başlık dosyasında tanımlanan bir makrodur. –
Belki '_2a' bir makrodur. –
iyi bir ipucu - bir makro tanımı görebiliyorum. Soruyu güncelliyorum. – Stefan