如何定义宏以将连接的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) 将其概括为具有一个获取任意数量参数并在正确位置添加Ls 的宏是可能的,但更复杂。你可以在 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字符串的主要内容,如果未能解决你的问题,请参考以下文章

如何定义 swig 类型映射以将 unsigned char* 返回到 java

如何创建接口以将 c 字符数组转换为 fortran

如何检查字符串是不是正确以将其转换为 int?

C语言如何实现两个非常量的CHAR字符串连接

如何将char类型数组转换为unicode字符串

如何从string类型的变量 返回一个char* 类型