Макрос без пространства
У меня есть макрос, который я использую для отладки.
#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 ответа
Вы можете использовать оператор вставки токена##
:
#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
В качестве первого аргумента этого макроса (и действительно, даже если вы не планируете его), вам понадобится еще один слой косвенности в макросе, поэтому определение будет оцениваться, а не вставляться вместе с L
как текст См. Ответ Mooing Duck, чтобы узнать, как это сделать. На самом деле это правильный способ сделать это, но я не удаляю этот ответ, потому что я хочу сохранить 80 повторений.
Я смутно помню, что ответ был чем-то вроде
//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++