Спор Макроса Concat с пространством имен

У меня есть макрос, где одним из аргументов является перечисление значений, которое дано, не указывая объем пространства имен. Однако где-нибудь в макросе я должен получить доступ к нему (очевидно, я должен определить пространство имен там), но я не могу казаться concat именем пространства имен с шаблонным параметром. Учитывая следующий samplecode компилятор жалуется это pasting :: and Val doesnt give a valid preprocessor token (это хорошо работает для concating, добираются и до getVal хотя).

 namespace TN
 {
    enum Info
    {
        Val = 0
    };
 }

#define TEST(a) TN::Info get ## a(){return TN::##a;}
TEST(Val)

Так есть ли любой способ сделать эту работу, не используя другой аргумент и в основном указывая значение, которое будет использоваться дважды (например. #define TEST(a,b) TN::Info get ## a(){return b;})?

5
задан a3f 31 March 2015 в 02:14
поделиться

2 ответа

## - это оператор вставки токена, т.е. он должен сделать один токен из нескольких бит токена, и, как говорит компилятор, :: Val isn Не один жетон, это два жетона.

Зачем вам вообще нужно думать, что вам нужен второй ## ? Что с этим не так.

#define TEST(a) TN::Info get ## a () { return TN::a; }
10
ответ дан 18 December 2019 в 14:47
поделиться

Используйте ## только тогда, когда вы хотите объединить два элемента и заставить компилятор обрабатывать результат как один токен (например, идентификатор).

В вашем макросе первое использование ## является правильным, поскольку вы пытаетесь построить идентификатор, вставляя вместе get и содержимое a , но второе использование ## является ложный, так как вы просто хотите сделать идентификатор из содержимого a , а оператор :: является отдельным от этого элементом. GCC будет жаловаться на это (хотя MSVC ++ справляется).

#define TEST(a) TN::Info get ## a(){return TN::a;}

должно работать.

но второе использование ## является ложным, так как вы просто хотите создать идентификатор из содержимого a , а оператор :: является отдельной сущностью для этого. GCC будет жаловаться на это (хотя MSVC ++ справляется).

#define TEST(a) TN::Info get ## a(){return TN::a;}

должно работать.

но второе использование ## является ложным, так как вы просто хотите создать идентификатор из содержимого a , а оператор :: является отдельной сущностью для этого. GCC будет жаловаться на это (хотя MSVC ++ справляется).

#define TEST(a) TN::Info get ## a(){return TN::a;}

должно работать.

3
ответ дан 18 December 2019 в 14:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: