У меня есть макрос, где одним из аргументов является перечисление значений, которое дано, не указывая объем пространства имен. Однако где-нибудь в макросе я должен получить доступ к нему (очевидно, я должен определить пространство имен там), но я не могу казаться 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;}
)?
##
- это оператор вставки токена, т.е. он должен сделать один токен из нескольких бит токена, и, как говорит компилятор, :: Val
isn Не один жетон, это два жетона.
Зачем вам вообще нужно думать, что вам нужен второй ##
? Что с этим не так.
#define TEST(a) TN::Info get ## a () { return TN::a; }
Используйте ## только тогда, когда вы хотите объединить два элемента и заставить компилятор обрабатывать результат как один токен (например, идентификатор).
В вашем макросе первое использование ## является правильным, поскольку вы пытаетесь построить идентификатор, вставляя вместе 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;}
должно работать.