Использование #ifdef для макросов, вставленных в токен? - PullRequest
0 голосов
/ 26 июня 2019

Я знаю, что уже есть похожий пост на мой ( C ++ `ifdef` с конкатенацией значений макросов ), но пост довольно старый и предоставленное решение не работает для меня, потому что я не могу установить определение, которое я хочу проверить. Поэтому я надеюсь, что кто-то может мне помочь.

Проблема в том, что я хочу сделать ifdef для конкатенации двух определений с фиксированным текстом.

Представьте себе следующий код

#define ENABLE_MODULE_1

enum Modultype
{
    MODULE_1,
    MODULE_2
};

#define MODULE MODULE_1


int main()
{
    #ifdef ENABLE_ ## MODULE
    printf("NAME defined");
    #else
    printf("NAME not defined");
    #endif
    return 0;
}

Поэтому я хочу проверить, определено ли ENABLE_MODULE_1 на основе определения MODULE.

Я надеюсь, что кто-то может мне помочь. Спасибо!

Ответы [ 2 ]

0 голосов
/ 26 июня 2019

Вы не можете делать в точности то, что хотите, потому что #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
0 голосов
/ 26 июня 2019

Это невозможно. Макросы препроцессора раскрываются только один раз и только тогда, когда их нет в другом операторе препроцессора. Вместе с тем, конкатенации могут использоваться только внутри оператора #define.

...