Как объединять, оценивать и структурировать макросы? - PullRequest
0 голосов
/ 30 мая 2018

Я пытаюсь привести в порядок подстановку (оценку) конкатенации макросов.Например:

#include <stdio.h>

#define FOO_ONE 12
#define FOO_TWO 34
#define BAR_ONE 56
#define BAR_TWO 78

#define MAKE_MAC(mac) // ... what to do here?

void main(int argc, char *argv[])
{
    printf("FOO: " MAKE_MAC(FOO) "\n");
    printf("BAR: " MAKE_MAC(BAR) "\n");
}

Результат, который я ищу:

FOO: 1234
BAR: 5678

Я пробовал несколько форм, думаю, что лучшая попытка заключается в следующем:

#define STRINGIFY(mac) #mac
#define CONCAT(mac1, mac2) STRINGIFY(mac1 ## mac2)
#define MAKE_MAC(mac) CONCAT(mac, _ONE) CONCAT(mac, _TWO)

Но это только уводит меня так далеко:

FOO: FOO_ONEFOO_TWO
BAR: BAR_ONEBAR_TWO

Итак, как я могу добавить дополнительный шаг оценки полученного каскадного макроса, прежде чем он будет преобразован в строку?

Ответы [ 2 ]

0 голосов
/ 30 мая 2018

Попробуйте:

#include <stdio.h>

#define FOO_ONE 12
#define FOO_TWO 34
#define BAR_ONE 56
#define BAR_TWO 78

#define STRINGIFY(arg) #arg
#define CONCAT(arg1, arg2) STRINGIFY(arg1) STRINGIFY(arg2)

#define MAC(arg) CONCAT(arg##_ONE, arg##_TWO)

int main(){

    printf("FOO: " MAC(FOO) "\n");
    printf("BAR: " MAC(BAR) "\n");

    return 0;
}

Мой вывод:

FOO: 1234
BAR: 5678
0 голосов
/ 30 мая 2018

Вам нужно отложить строковое преобразование, введя слой косвенности:

#define STRINGIFY_X(x) #x
#define STRINGIFY(x) STRINGIFY_X(x)
#define MAKE_MAC(mac) STRINGIFY(mac ## _ONE) STRINGIFY(mac ## _TWO)

живой пример на wandbox.org

...