Макрос без пространства

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

#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++

Другие вопросы по тегам