В макросе C действительно ли возможно использовать для своей выгоды вставляемый - в маркере? Например, у меня в настоящее время есть следующий макрос:
#define TEST(name, keyword) \
test_##name:
TEST_##keyword##_KEYWORD
Я вызвал бы это следующим образом:
TEST(test1, TEST1)
который привел бы к следующему:
test_test1:
TEST_TEST1_KEYWORD
Теперь, вместо того, чтобы иметь необходимость ввести то же имя дважды (однажды со всеми символами нижнего регистра, и снова со всеми символами верхнего регистра), там какой-либо способ, которым я мог сделать любое из следующих, и или изменить маркер во все прописные буквы или все строчные буквы?
TEST(test1) or TEST(TEST1)
Спасибо, Ryan
Насколько мне известно, единственные операции, которые могут выполняться с токенами в препроцессоре C (по крайней мере, стандарт ISO / ANSI), - это заменить, преобразовать в строку или объединить их. Мне также неизвестны какие-либо расширения GCC или MSVC, которые позволят вам делать то, что вы хотите.
Однако люди придумывают умные (или необычные) способы делать волшебные (или ужасные) вещи с помощью макросов, поэтому я не удивлюсь, если кто-то меня удивит.
Вы можете сделать что-то вроде следующего (не проверено, возможно опечатки...)
#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
(но, возможно, вам придется сделать несколько промежуточных вспомогательных макросов, пока вы не сделаете все конкатенации правильно)
. пока не получите все конкатенации правильно)