如何定义宏以将连接的char字符串转换为C中的wchar_t字符串
Posted
技术标签:
【中文标题】如何定义宏以将连接的char字符串转换为C中的wchar_t字符串【英文标题】:how to define macro to convert concatenated char string to wchar_t string in C 【发布时间】:2012-05-30 16:18:11 【问题描述】:和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"
如何使用宏将两个连接的字符字符串转换为wchar_t
?问题是我有一些已经存在的宏:
#define BAR "The fist line\n" \
"The second line\n"
我想在编译期间将它们转换为 wchar
字符串。 windows下编译器为ICC。
编辑:_L
宏在 gcc 中有效,MSVC 和 ICC 无效,这是一个编译器错误。
感谢@R.. 给我评论。
【问题讨论】:
如果我没记错的话,你不需要写宏。只需将字符串彼此相邻放置,它们就会自动连接成一个。至少这适用于 gcc。 这纯粹是 MSVC 中的一个错误。 C 语言允许连接不同宽度的字符串,结果是一个宽字符串。 @nhahtdh 我不是要连接两个字符串。我想将联系字符串转换为 wchar。 与L""
连接是转换为宽字符串的标准规范方式。
看起来 MSVC 符合 C89 但不符合 C99。见***.com/questions/2192416/…
【参考方案1】:
我认为你做不到。
宏只是做简单的文本处理。他们可以在开头添加L
,但不能说"abc\n" "def\n"
是两个字符串,需要添加两次L
。
如果将字符串传递给以逗号分隔而不是串联的宏,则可以取得进展:L("abc\n", "def\n")
定义只接受两个字符串的L
很简单:#define L2(a,b) _L(a) _L(b)
将其概括为具有一个获取任意数量参数并在正确位置添加L
s 的宏是可能的,但更复杂。你可以在 Jens Gustedt's P99 macros 中找到聪明的宏做这些事情。
【讨论】:
是的,如果 C 编译器正确支持 C99 标准(如 GCC),我可以。另一个问题说这个***.com/questions/2192416/… @RolandXu,预处理器不能做他想做的事,即生成L"abc" L"def"
。编译器可以(尽管 MSVC 似乎不能)将L"abc" "def"
完全视为一个宽字符串。
@ugoren 好的,明白了。预处理器不能。编译器可以如果支持 c99以上是关于如何定义宏以将连接的char字符串转换为C中的wchar_t字符串的主要内容,如果未能解决你的问题,请参考以下文章