Расширение макроса в C ++ - PullRequest
       12

Расширение макроса в C ++

2 голосов
/ 23 марта 2009

Как я могу определить макрос (или обходной путь для этого), где параметр находится в начале строки?

#define SINGLETON_IMPLEMENTATION(className) \
    ##className* ##className::instance_ = NULL;

Это выдает предупреждение компилятора (GCC 3.2.3): «## не может появляться ни в одном конце макроподключения»

Ответы [ 2 ]

12 голосов
/ 23 марта 2009

Вам нужно только ## добавить параметр в другую строку. Ваш макрос может быть преобразован как

#define SINGLETON_IMPLEMENTATION(className) \
    className* className::instance_ = NULL;
6 голосов
/ 23 марта 2009

## - оператор конкатенации; компилятор просто жалуется на это.
Вы не можете объединить токен без чего-либо перед ним, то есть в начале раскрытия макроса; просто попробуйте удалить ## в начале второй строки.
Также второй ## кажется неправильным. Если вы просто хотите инициализировать одноэлементный указатель, удалите оба ## s из вашего макроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...