与Visual Studio中的_T()
宏类似,我定义并使用自己的_L
宏作为:
#define _L(x) __L(x)
#define __L(x) L ## x
适用于:
wprintf(_L("abc\n"));
但是得到了编译错误:
wprintf(_L("abc\n""def\n"));
报告“不能连接不同字符种类的字符串文字”。
我也做了:
#define _L2(x) __L2(x)
#define __L2(x) L ## #x
wprintf(_L2("abc\n""def\n"));
代码被编译,但\n
不能作为新行的转义序列。 \n
变为两个字符,wprintf
的输出为:
“ABC \ n” 个 “DEF \ n” 个
如何使用宏将两个连接的char字符串转换为wchar_t
?问题是我有一些已经存在的宏:
#define BAR "The fist line\n" \
"The second line\n"
我想在编译期间将它们转换为wchar
字符串。编译器是Windows中的ICC。
修改:
_L
宏在gcc中工作,MSVC和ICC不起作用,这是编译器错误。
谢谢@R ..对我发表评论。
答案 0 :(得分:2)
我认为你不能这样做。
宏只是做简单的文本处理。他们可以在开头添加L
,但不能告诉"abc\n" "def\n"
是两个字符串,需要两次添加L
。
如果将字符串传递给以逗号分隔的宏,而不是连接,则可以取得进展:
L("abc\n", "def\n")
定义恰好接受两个字符串的L
是微不足道的:
#define L2(a,b) _L(a) _L(b)
将其概括为具有单个宏,该宏可以获取任意数量的参数并将L
添加到正确的位置,但更复杂。您可以在Jens Gustedt's P99 macros中找到执行此类操作的聪明宏。