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

标签 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..给我评论。

最佳答案

我认为你做不到。

宏只是做简单的文本处理。可以在开头加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 中找到执行此类操作的聪明宏。 .

关于c - 如何定义宏以将连接的 char 字符串转换为 C 中的 wchar_t 字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10731428/

相关文章:

c - -O0 编译器标志是否与 C 中的 volatile 关键字具有相同的效果?

c - 我怎样才能把它分解成函数?

python - 用条纹数替换字符串

macros - Common Lisp 宏中的词法绑定(bind)

c - 如何将 C 宏 (#define) 分离到 .h 和 .c 文件中

macros - SAS 宏从表中提取选定的行

c - 字符串创建时的段错误

c - 功能段错误

c++ - C++中如何从字符串中读取字符和数字

c - 查找所有 k 长度子串时如何避免重复