#include <stdio.h>
// Here is the master list of things
#define THING_DEFINITIONS \
THING(apple, true) \
THING(pear, true) \
THING(caddilac, false) \
THING(mango, true)
// I want a table of all thing names -- this works fine
#undef THING
#define THING(name, is_fruit) #name,
char *all_things[] = {
THING_DEFINITIONS
};
// Now I want a table of just fruits -- the following does not work
#undef THING
// Options
#define THING_true(name) #name,
#define THING_false(name)
// Combine symbols
#define CONCAT(a, b) a ## b
// Final macro
#define THING(name, is_fruit) CONCAT(THING_, is_fruit) (name)
char *just_fruits[] = {
THING_DEFINITIONS
};
int main(void) {
for(int i=0;i<(sizeof just_fruits / sizeof *just_fruits);++i) {
printf("%s\n", just_fruits
[i
]); }
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CgovLyBIZXJlIGlzIHRoZSBtYXN0ZXIgbGlzdCBvZiB0aGluZ3MKI2RlZmluZSBUSElOR19ERUZJTklUSU9OUyBcCiAgVEhJTkcoYXBwbGUsIHRydWUpIFwKICBUSElORyhwZWFyLCB0cnVlKSBcCiAgVEhJTkcoY2FkZGlsYWMsIGZhbHNlKSBcCiAgVEhJTkcobWFuZ28sIHRydWUpCgovLyBJIHdhbnQgYSB0YWJsZSBvZiBhbGwgdGhpbmcgbmFtZXMgLS0gdGhpcyB3b3JrcyBmaW5lCiN1bmRlZiBUSElORwojZGVmaW5lIFRISU5HKG5hbWUsIGlzX2ZydWl0KSAjbmFtZSwKY2hhciAqYWxsX3RoaW5nc1tdID0gewogIFRISU5HX0RFRklOSVRJT05TCn07CgovLyBOb3cgSSB3YW50IGEgdGFibGUgb2YganVzdCBmcnVpdHMgLS0gdGhlIGZvbGxvd2luZyBkb2VzIG5vdCB3b3JrCiN1bmRlZiBUSElORwoKCi8vIE9wdGlvbnMKI2RlZmluZSBUSElOR190cnVlKG5hbWUpICNuYW1lLAojZGVmaW5lIFRISU5HX2ZhbHNlKG5hbWUpCgovLyBDb21iaW5lIHN5bWJvbHMKI2RlZmluZSBDT05DQVQoYSwgYikgYSAjIyBiCgovLyBGaW5hbCBtYWNybwojZGVmaW5lIFRISU5HKG5hbWUsIGlzX2ZydWl0KSAgQ09OQ0FUKFRISU5HXywgaXNfZnJ1aXQpIChuYW1lKQoKY2hhciAqanVzdF9mcnVpdHNbXSA9IHsKICBUSElOR19ERUZJTklUSU9OUwp9OwoKCmludCBtYWluKHZvaWQpIHsKCWZvcihpbnQgaT0wO2k8KHNpemVvZiBqdXN0X2ZydWl0cyAvIHNpemVvZiAqanVzdF9mcnVpdHMpOysraSkgewoJCXByaW50ZigiJXNcbiIsIGp1c3RfZnJ1aXRzW2ldKTsKCX0KCXJldHVybiAwOwp9Cg==