Ответ 1
Возможно, попробуйте несколько многоэтапных расширений макросов? Это стратегия, используемая Boost preprocessor/control/if library.
#define FOO_NAME 1
#define FOO__ 2
#define CONC(a,b) a##_##b
#define FOO(x) CONC(FOO,x)
Я не думаю, что есть какой-либо способ проверить условия в расширении макроса C.
Лучшее, что я мог придумать, - это скрывать макро аргументы в строковом литерале с помощью оператора строки #
, а затем проверять использование функций времени выполнения. (Это не будет работать для вашего случая, хотя, где вы хотите выводить объявления переменных.)
Например, следующие отпечатки "011":
#define FOO(x) (strcmp("NAME", #x) ? 1 : 0)
main()
{
printf("%d", FOO(NAME));
printf("%d", FOO(1));
printf("%d", FOO(2));
}
Компилятор, скорее всего, оптимизирует сравнение strcmp
во время компиляции, поэтому он не будет более неэффективным, чем если бы у него были доступные предварительные процессоры. Однако, делая FOO
, нормальная функция будет более ясной и, вероятно, такой же эффективной.