Принудительно использовать пробелы в макросе C?
-
11-09-2019 - |
Вопрос
У меня есть следующий макрос для определения новой функции в соответствии со специальной схемой именования:
#define CREATE_HOOK_STUB( func ) void ##func_STUB() { /* some code*/ }
Однако препроцессор всегда выполняет конкатенацию void
и ##func_STUB
но я, очевидно, хочу, чтобы он сохранил пробел в этой позиции.
Я знаю, что я мог бы просто добавить какую-нибудь строку к ##func_STUB
, но это не то, чего я хочу.Как бы я решил это?
Решение
Я думаю, что то, чего вы действительно хотите, ближе к:
#define CREATE_HOOK_STUB( func ) void func##_STUB() { /* some code*/ }
Но вам также следует обратить внимание на это связано С ТАКИМ ответом который содержит некоторые дополнительные сведения о поведении оператора вставки токена:
Одна вещь, о которой следует помнить, когда вы используете операторы предварительной обработки token-paste ('##') или stringizing ('#'), заключается в том, что вам нужно использовать дополнительный уровень косвенности, чтобы они работали должным образом во всех случаях.
Если вы этого не сделаете и элементы, передаваемые оператору вставки токенов, сами по себе являются макросами, вы получите результаты, которые, вероятно, не то, что вы хотите...