Макрос без пробела - PullRequest
       32

Макрос без пробела

4 голосов
/ 22 марта 2012

У меня есть макрос, который я использую для отладки.

#define diagnostic_arg(message,...) fprintf(stderr,message,__VA_ARGS__)

Я обнаружил, что мне нужно использовать широкие символы в моей программе, поэтому я хотел бы изменить только свой макрос и все работает:

#define diagnostic_arg(message,...) fwprintf(stderr,message,__VA_ARGS__)

Однако мне нужны строки широких символов, которые определяются путем помещения L перед начальным кавычком строки:

#define diagnostic_arg(message,...) fprintf(stderr,Lmessage,__VA_ARGS__)

Теперь очевидно, что вышелиния не работает.Но если я использую L message, это тоже не сработает.Так как мне написать Lmessage и сделать так, как я хотел бы?

Ответы [ 2 ]

14 голосов
/ 22 марта 2012

Вы можете использовать оператор вставки токена ##:

#define diagnostic_arg(message,...) fprintf(stderr,L##message,__VA_ARGS__)

Однако, может быть, лучше использовать макрос TEXT (если вы находитесь в Visual Studio), который будет правильно делать, независимо от того, определен UNICODE или нет:

#define diagnostic_arg(message,...) fprintf(stderr,TEXT(message),__VA_ARGS__)

Если нет, TEXT можно определить так:

#ifdef UNICODE
#define TEXT(str) L##str
#else
#define TEXT(str) str
#endif

Однако , если вы планируете использовать другие #define s в качестве первого аргумента этого макроса (и действительно, даже если вы не планируете его), вам понадобится еще один уровень косвенности в макрос, поэтому определение будет оцениваться вместо вставки вместе с L как текст. См. Ответ Mooing Duck, чтобы узнать, как это сделать. На самом деле это правильный способ сделать это, но я не удаляю этот ответ, потому что хочу сохранить 80 повторений.

7 голосов
/ 22 марта 2012

Я смутно припоминаю, что ответ был чем-то вроде

//glues two symbols together that can't be together
#define glue2(x,y) x##y
#define glue(x,y) glue2(x,y) 
//widens a string literal
#define widen(x) glue(L,x)

#define diagnostic_arg(message,...) fprintf(stderr,widen(message),__VA_ARGS__)

Клей иногда должно быть двумя макросами (как я показал), по странным причинам, я не совсем понимаю, объяснил в C ++ faq

...