Конкатенация ключевого слова и аргумента макроса с пробелом между ними - PullRequest
0 голосов
/ 08 августа 2010

Моя проблема довольно проста. Я хочу следующий макрос

#define PROXYPASS(name, param) \
void MyClass::sl_name(param _param) { \
    emit name(_param); \
}

для расширения PROXYPASS(clientAdded, Client*) до:

void MyClass::sl_clientAdded(Client* _param) { \
    emit clientAdded(_param); \
}

но так как он не работает, т.е. он все равно показывает sl_name вместо sl_clientAdded. Итак, вот что я использую:

#define PROXYPASS(name, param) \
void MyClass::sl_ ## name(param _param) { \
    emit ## name(_param); \
}

Работает нормально, за исключением того, что расширяется до:

void MyClass::sl_clientAdded(Client* _param) { \
    emitclientAdded(_param); \
}

Все хорошо, за исключением того факта, что между emit и clientAdded нет пробела, т.е. он расширяется до emitclientAdded вместо emit clientAdded. Итак, как мне это сделать? Есть ли способ добавить пробелы, или я должен искать другой путь. Множество поисковиков не оправдали мои надежды из-за следующего утверждения: Помещает ли он [препроцессор gcc] пробел между токенами, неопределено. Мои другие неудачные попытки включают

emit ## ## name(_param);
emit ## /* */ ## name(_param);
emit ## \ ## name(_param);
emit /* */ ## name(_param);
emit ## space ## name(_param); [#define space \ ]

Любая помощь очень ценится.

ПРИМЕЧАНИЕ: Выход препроцессора и расширение макроса проверяются с помощью gcc -E myclass.cpp.

1 Ответ

0 голосов
/ 08 августа 2010

Просто ничего не кладите туда, вам не нужно ничего объединять:

#define PROXYPASS(name, param) \
void MyClass::sl_ ## name(param _param) { \
    emit name(_param); \
}
...