如何定义宏以将连接的char字符串转换为C中的wchar_t字符串

时间:2012-05-24 05:02:54

标签: c string macros wchar

与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 ..对我发表评论。

1 个答案:

答案 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中找到执行此类操作的聪明宏。