Оператор вставки токена (##) использует пробелы в моем макросе C ++ - PullRequest
1 голос
/ 25 января 2012

У меня возникли проблемы со следующим макросом, и я обнаружил, что оператор вставки токена (##) использует пространство между static и типом возврата:

#define MY_FUNCTION(aReturnType) static ##aReturnType MyFunction() { }

Итак, препроцессор поворачивал это:

MY_FUNCTION(bool)

в это:

staticbool MyFunction() { }

, что вызвало странные ошибки компиляции.

Мне пришла в голову идея поставить круглые скобки вокруг ключевого слова static:

// This works but is kind of weird
#define MY_FUNCTION(aReturnType) (static) ##aReturnType MyFunction() { }

Есть ли лучшие решения?

Ответы [ 2 ]

8 голосов
/ 25 января 2012

Я думаю, что ваша проблема в том, что вы не хотите использовать токен-вставку здесь.Если вы измените макрос на

#define MY_FUNCTION(aReturnType) static aReturnType MyFunction() { }

Тогда, если вы напишите

MY_FUNCTION(bool)

, он расширится до

static bool MyFunction() { }

Я предполагаю, что это то, что выхочу сделать, так как я не вижу, что вы пытаетесь вставить в макрос аргумент aReturnType.

Надеюсь, это поможет!

3 голосов
/ 25 января 2012

Как это должно быть?Вы сказали это склеить static и bool.Если вы этого не хотите и вместо этого хотите static bool, не вставляйте их вместе ?

...