Эквивалент хэш-хэш в имени определения

#c #metaprogramming #c-preprocessor #c99

#c #метапрограммирование #c-препроцессор #c99

Вопрос:

В a #define можно использовать A ## B для объединения переменных препроцессора и определения идентификатора.

 #define ADD_UNDERSCORE(X) X##_
/* ADD_UNDERSCORE(n) -> n_ */
  

Существует ли эквивалентная левая сторона #define ? Например.

 #define A a
#define B b
#define A##B(X) X
/* ab(n) -> n */
  

Комментарии:

1. В комментарии во втором примере вы имеете в виду ab(n) -> n ? Я не совсем понимаю, чего вы пытаетесь достичь.

2. @Vicky: да, я имел в виду ab(n) , исправлено.

Ответ №1:

Нет. В определении макроса первым токеном после define должен быть идентификатор ((проект) ISO / IEC 9899; 1999, 6.10, стр. 149).

Нет другой предварительной обработки #define директив, которая могла бы создать идентификатор из чего-то другого. В частности, стандарт определяет (6.10.3):

Токены предварительной обработки в директиве предварительной обработки не подлежат расширению макроса, если не указано иное.

И для имени макроса не указано «иначе».

Комментарии:

1. Очень жаль. 🙁 Спасибо за точный ответ!