Возможно, попробуйте несколько многоступенчатого расширения макросов? Это стратегия, используемая 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
, нормальная функция будет более ясной и, вероятно, такой же эффективной.
Макросы являются удивительными. –
Не могли бы вы объяснить цель или, может быть, дать лучший пример? Параметр должен быть исправлен во время компиляции, а это значит, что вы можете использовать два разных имени макроса. – lurker
@mbratch: В этом конкретном случае я использую макрос для определения набора переменных, но некоторые переменные являются необязательными, и я хочу избежать их определения. Несколько имен макросов не будут работать хорошо из-за комбинаторного взрыва: с двумя именами переменных мне нужны отдельные макросы для 'foo (a, b)', 'foo (a, _)', 'foo (_, b)' и ' Foo (_, _) '. – hugomg