6

_T()Visual Studio 中的宏一样,我定义并使用了自己的_L宏:</p>

#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""定义\n"

我怎样才能有一个宏来将两个连接的 char 字符串转换为wchar_t?问题是我有一些已经存在的宏:</p>

#define BAR  "The fist line\n" \
             "The second line\n"

我想wchar在编译期间将它们转换为字符串。编译器是windows中的ICC。

编辑:宏在 gcc
_L有效,MSVC 和 ICC 无效,这是一个编译器错误。谢谢@R..给我评论。

4

1 回答 1

2

我不认为你能做到这一点。

宏只是做简单的文本处理。他们可以L在开头添加,但不能说"abc\n" "def\n"是两个字符串,需要添加L两次。

如果将字符串传递给以逗号分隔的宏,而不是串联,则可以取得进展:
L("abc\n", "def\n")

L定义恰好接受两个字符串是微不足道的:
#define L2(a,b) _L(a) _L(b)
将其概括为具有单个宏,该宏可以获取任意数量的参数并L在正确的位置添加 s 是可能的,但更复杂。您可以在Jens Gustedt 的 P99 宏中找到做这些事情的聪明宏。

于 2012-05-24T08:04:22.787 回答