Я использую gcc (в частности avr-gcc).
Итак, это моя головоломка:
Скажем, я определил где-то это:
#define THING_0_A 0
#define THING_0_B 1
#define THING_1_A 0
Затем во втором файле у меня есть:
#define CONCAT_(A,B,C) A ## B ## C
#define CONCAT(A,B,C) CONCAT_(A,B,C)
#define ID 0
#define THING_N(A) CONCAT(THING_,ID,A)
С этим теперь у меня есть выбор выражений (все еще во втором файле):
THING_N(_A) // evaluates to 0
THING_N(_B) // evaluates to 1
THING_N(_C) // evaluates to... nothing? Or undefined? Or THING_0_C?
Теперь, что я пытаюсь решить, как это сделать (также все еще во втором файле):
#ifdef THING_N(_A)
// Do something knowing that THING_N(_A) is defined (in this case THING_0_A)
#endif
Или:
#if THING_N(_A)
// Do something knowing that the value THING_N(_A) evaluates to is defined and not just "nothing"
#endif
Конечно, ни одна из них не работает, потому что #ifdef не может принимать выражение в качестве аргумента (и в любом случае оно будет равно "#ifdef 0" ), а THING_N (_A) оценивается 0 в #if.
Другими словами, я ищу способ оценить препроцессор:
THING_N(_A) to true
THING_N(_B) to true
THING_N(_C) to false
THING_N(_D) to false
etc...
который будет использоваться в условном выражении.