Nesneleri bir makro tanımına eklemek için standart C'de veya GNU uzantılarında herhangi bir yol var mı? E.g., ben ekleyebilirsiniz
#define List foo bar
olarak tanımlanan bir makro verilen bas
o List
bunu
#define List foo bar bas
tanımlanmış sanki genişler böylece?Bir önişlemci makrosuna ekleyebilir miyim?
Ben böyle bir şey yapabileceğini umuyordum:
#define List foo bar bas
#define List_ Expand(List)
#undef List
#define List Expand(List_) quux
ama Expand()
makro tanımlamak anlamaya olamaz bu yüzden istediğimi yapacağım.
Motivasyon: Ben ayrımcılığa oynuyorum /bu satırlar boyunca sendikaları tagged:
struct quux_foo { int x; };
struct quux_bar { char *s; };
struct quux_bas { void *p; };
enum quux_type {quux_foo, quux_bar, quux_bas};
struct quux {
enum quux_type type;
union {
struct quux_foo foo;
struct quux_bar bar;
struct quux_bas bas;
} t;
};
Bu X-makro için iyi bir yerdir anlamaya. quux_*
yapıları senkronize edilmemiş olsun, Tabii
#define X(t) quux_ ## t,
enum quux_type {quux_table};
#undef X
#define X(t) struct quux_ ## t t;
struct quux {
enum quux_type type;
union {quux_table} t;
};
#undef X
, bu yüzden istiyorum: Bir makro
#define quux_table X(foo) X(bar) X(bas)
numaralandırma & yapı asla Bu şekilde tanımlanan ve edilebilmektedir tanımlarsanız senkronizasyonu bozuluyor sadece yasal olarak böyle bir şey yapmak:
struct quux_foo { int x; };
#define quux_table quux_table X(foo)
struct quux_bar { char *s; };
#define quux_table quux_table X(bar)
struct quux_bas { void *p; };
#define quux_table quux_table X(bas)
(Eh, gerçekten yapabilmek istiyorum neyi
gibi bir şeymember_struct(quux, foo) { int x; };
ama iyi (yeniden) makro olamaz farkında makrolar içinden tanımlanmış değilim.)
neyse, bu benim motive örnek. Bunu başarmanın bir yolu var mı?
Yükseltme X-makro tekniğinin bu kitaplık ile nasıl çalışacağını bana gösterebilirseniz, işlem öncesi örnekler iyidir.
Evet, bu kesinlikle yapılabilir, eğer redefinition konusunda ısrar etmiyorsanız. Ham preprocessor kullanırsanız biraz acı. Boost.Preprocessor ile biraz daha az acı verici. Ne yazık ki benim soğuğum, bir yöntem üretecek kadar dürüst düşünmemi engelliyor. Umarım bir başkası olur. – swestrup