Можно ли использовать для своей выгоды вставляемый маркер в макросе?

В макросе C действительно ли возможно использовать для своей выгоды вставляемый - в маркере? Например, у меня в настоящее время есть следующий макрос:

#define TEST(name, keyword) \
    test_##name:
        TEST_##keyword##_KEYWORD

Я вызвал бы это следующим образом:

TEST(test1, TEST1)

который привел бы к следующему:

test_test1:
    TEST_TEST1_KEYWORD

Теперь, вместо того, чтобы иметь необходимость ввести то же имя дважды (однажды со всеми символами нижнего регистра, и снова со всеми символами верхнего регистра), там какой-либо способ, которым я мог сделать любое из следующих, и или изменить маркер во все прописные буквы или все строчные буквы?

TEST(test1) or TEST(TEST1)

Спасибо, Ryan

34
задан DuneBug 3 August 2010 в 20:09
поделиться

2 ответа

Насколько мне известно, единственные операции, которые могут выполняться с токенами в препроцессоре C (по крайней мере, стандарт ISO / ANSI), - это заменить, преобразовать в строку или объединить их. Мне также неизвестны какие-либо расширения GCC или MSVC, которые позволят вам делать то, что вы хотите.

Однако люди придумывают умные (или необычные) способы делать волшебные (или ужасные) вещи с помощью макросов, поэтому я не удивлюсь, если кто-то меня удивит.

13
ответ дан 27 November 2019 в 17:14
поделиться

Вы можете сделать что-то вроде следующего (не проверено, возможно опечатки...)

#define NORMALIZE(TOK) NORMALIZE_ ## TOK

и затем для каждой записи, которая может встретиться, сделать

#define NORMALIZE_test1 test1
#define NORMALIZE_TEST1 test1

затем использовать макрос NORMALIZE внутри вашего настоящего макроса, что-то вроде

#define TEST(name, keyword)                    \
    test_ ## NORMALIZE(name):                  \
        TEST_ ## NORMALIZE(keyword) ##_KEYWORD

(но, возможно, вам придется сделать несколько промежуточных вспомогательных макросов, пока вы не сделаете все конкатенации правильно)

. пока не получите все конкатенации правильно)

10
ответ дан 27 November 2019 в 17:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: