2016-10-11 3 views
0

Я пытаюсь сделать код-раздел многоразовым. Мой комментарий ниже фрагмент кода не делать то, что я хочу, чтобы:Подстановка макросов внутри макросов в C

#define NAME ABC 
#define LOG_SIZE NAME##_LEN 

Я хотел бы LOG_SIZE разрешить к ABC_LEN. Я пробовал играть с #, но не смог заставить это работать. LOG_SIZE используется во всем коде, так что я не хочу, чтобы изменить макрос:

#define LOG_SIZE(name) name##_LEN

Есть ли способ сделать это?

ответ

3

Проблема заключается в том, что аргументы макроса не разворачиваются автоматически, если они будут сжаты или объединены в другой токен.

C99 6.10.3.1/1:

После аргументов для вызова функции, как макро, были идентифицированы, замена аргумент имеет место. Параметр в списке замещения, за исключением случаев, когда предшествует токен # или ## препроцессора или за ним следует токен предварительной обработки ## (см. Ниже), заменяется соответствующим аргументом после того, как все макросы, содержащиеся в нем, были расширены. Перед заменой токены предварительной обработки каждого аргумента полностью заменяются макросами, как если бы они составляли остальную часть файла предварительной обработки; нет других токенов предварительной обработки.

Вы можете обойти эту проблему, добавив еще один макрос между тем, что проходит NAME и тот, объединяющий его с _LEN.

#define NAME ABC 
#define AFTERX(x) x##_LEN 
#define XAFTERX(x) AFTERX(x) 
#define LOG_SIZE XAFTERX(NAME) 

LOG_SIZE 
//evaluates to ABC_LEN 

ССАГПЗ руководство переходит в более подробно, если вам интересно, в Section 3.10.6: Argument Prescan

Смежные вопросы