Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何将#定义的字符串文字转换为宽字符串文字?_C_C Preprocessor - Fatal编程技术网

C 如何将#定义的字符串文字转换为宽字符串文字?

C 如何将#定义的字符串文字转换为宽字符串文字?,c,c-preprocessor,C,C Preprocessor,可能重复: 我使用#define定义了一个字符串文字: 如何使用此定义在编译时获取此宽字符串文字 L"1234\0" (只需将#defined字符串文字加上L前缀,使其成为宽字符串) 我试过这个: #define MAKEWIDE(s) L##s 但这会生成LB标记粘贴需要额外的间接级别来正确处理用作操作数的宏。尝试以下方法: #define PASTE(x, y) x##y #define MAKEWIDE(x) PASTE(L,x) 这将很好地工作: #define B "1234\

可能重复:

我使用#define定义了一个字符串文字:

如何使用此定义在编译时获取此宽字符串文字

L"1234\0"
(只需将
#define
d字符串文字加上
L
前缀,使其成为宽字符串)

我试过这个:

#define MAKEWIDE(s) L##s

但这会生成
LB

标记粘贴需要额外的间接级别来正确处理用作操作数的宏。尝试以下方法:

#define PASTE(x, y) x##y
#define MAKEWIDE(x) PASTE(L,x)

这将很好地工作:

#define B "1234\0"
#define LB L"" B

这里的答案还请注意,您通常不需要将
'\0'
字符放在文本字符串的末尾-编译器将为您这样做。我能想到的唯一一种情况是,当您需要自己执行此操作时,您实际上需要在字符串末尾使用两个空字符,或者您需要确保使用文本初始化的字符数组获得空终止字符-在C中,大小刚好合适的字符数组不会获得空字符。明确地添加它将鼓励编译器至少生成一个警告。这两种用法很少有用。我希望有人会提到\0。我对字符串文字不负责,也不清楚它为什么会出现。聪明。不过,我还得做一些深入研究——我记得在别处看到过这种情况(我已经忘记了),但我记得有些编译器无法处理它。好吧——MSVC做不到:错误C2308:连接不匹配的字符串将宽“”与窄“1234”连接起来这方面的标准从C90改为C99——在C90中,它被称为未定义行为;C99对此进行了更改,以便将文本“转换”为宽字符字符串文本。因为MS从来都不支持C99,所以这种行为在某种程度上是可以理解的……啊,我认为这种行为可以追溯到宽字符串的开始……只是2016年的一条消息。。。VS2015运行正常。现在我们已经过了99年17年了,我认为这是最好的答案,除非你处理的是一个真正神秘的平台。有什么太复杂了-使用宏来实现这一点,或者必须通过辅助宏间接粘贴令牌?标记粘贴的helper宏通常是获得预期结果所必需的。因此,一般来说,如果在项目中的其他任何地方使用标记粘贴,那么应该已经有这样一个helper宏存在了。我的意思是,无论如何,根据标准C,简单的字符串连接应该在不使用任何预处理器技巧的情况下处理它。
#define B "1234\0"
#define LB L"" B