Вы не можете делать в точности то, что хотите, потому что #ifdef
работает с идентификатором, а не с выражением препроцессора, а оператор ##
может использоваться только в тексте замены определения макроса.
Есливы готовы определить ENABLE_MODULE_1
(если он вообще определен) с ненулевой константой в качестве текста замены, вы можете достичь чего-то похожего на то, что вы хотите, следующим образом:
#include <stdio.h>
#define XENABLED(x) ENABLE_ ## x
#define ENABLED(x) XENABLED(x)
#define XSTR(x) #x
#define STR(x) XSTR(x)
#define ENABLE_MODULE_1 1 /* enabled */
#define ENABLE_MODULE_3 0 /* not enabled */
#define MODULE MODULE_1
#define OTHER MODULE_2
#define ANOTHER MODULE_3
int main(void)
{
#if ENABLED(MODULE)
printf("%s enabled\n", STR(MODULE));
#else
printf("%s not enabled\n", STR(MODULE));
#endif
#if ENABLED(OTHER)
printf("%s enabled\n", STR(OTHER));
#else
printf("%s not enabled\n", STR(OTHER));
#endif
#if ENABLED(ANOTHER)
printf("%s enabled\n", STR(ANOTHER));
#else
printf("%s not enabled\n", STR(ANOTHER));
#endif
#if ENABLED(UNDEFINED)
printf("%s enabled\n", STR(UNDEFINED));
#else
printf("%s not enabled\n", STR(UNDEFINED));
#endif
return 0;
}
Вышеприведенная программа производитследующий вывод:
MODULE_1 enabled
MODULE_2 not enabled
MODULE_3 not enabled
UNDEFINED not enabled
ОБНОВЛЕНИЕ 1
Вот еще один вариант использования defined()
, который не требует ENABLE_MODULE_1
, ENABLE_MODULE_2
и т. д. длярасширить на что угодно (если они определены вообще).Он просто проверяет тесты, определены ли они.
Тест может быть косвенным:
#define MODULE MODULE_1
#if ENABLED(MODULE)
или прямым:
#if ENABLED(MODULE_1)
Вот вариант:
#include <stdio.h>
#define XENABLED(x) defined(ENABLE_ ## x)
#define ENABLED(x) XENABLED(x)
#define XSTR(x) #x
#define STR(x) XSTR(x)
#define ENABLE_MODULE_1
#define MODULE MODULE_1
#define OTHER MODULE_2
int main(void)
{
printf("Indirect tests...\n");
#if ENABLED(MODULE)
printf("%s enabled\n", STR(MODULE));
#else
printf("%s not enabled\n", STR(MODULE));
#endif
#if ENABLED(OTHER)
printf("%s enabled\n", STR(OTHER));
#else
printf("%s not enabled\n", STR(OTHER));
#endif
#if ENABLED(UNDEFINED)
printf("%s enabled\n", STR(UNDEFINED));
#else
printf("%s not enabled\n", STR(UNDEFINED));
#endif
printf("Direct tests...\n");
#if ENABLED(MODULE_1)
printf("%s enabled\n", STR(MODULE_1));
#else
printf("%s not enabled\n", STR(MODULE_1));
#endif
#if ENABLED(MODULE_2)
printf("%s enabled\n", STR(MODULE_2));
#else
printf("%s not enabled\n", STR(MODULE_2));
#endif
return 0;
}
Выход из вышеуказанного варианта:
Indirect tests...
MODULE_1 enabled
MODULE_2 not enabled
UNDEFINED not enabled
Direct tests...
MODULE_1 enabled
MODULE_2 not enabled