这是什么:L“ DLGCTRL_” L#dialog_control_id

时间:2018-12-19 23:37:44

标签: c++ string literals suffix

我已经在某些C ++ _ 11代码中找到了它:

L"DLGCTRL_"L#dialog_control_id

什么是“ L#”?没有#运算符或串联。 是的,“和L之间没有任何东西。这怎么允许?

我得到了错误:

  

错误C3688:字面后缀'L'无效;找不到文字运算符或文字运算符模板'运算符“” L“

我在Windows 10上拥有Visual Studio 2015和2017。 它可以在C ++ 98或00上正常编译

1 个答案:

答案 0 :(得分:2)

我认为这是在预处理器宏中发生的,否则这个问题根本就没有意义,例如:

#define X(dialog_control_id)  L"DLGCTRL_"L#dialog_control_id

打算将X(foo)扩展到L"DLGCTRL_foo"的地方。


代码应该为:

#define X(dialog_control_id)  L"DLGCTRL_" #dialog_control_id

原始代码中有几个问题:

  • L#在ISO C ++中是不允许的,它是Microsoft预处理程序的扩展,用于生成宽字符串文字。
  • 在C ++ 11预处理器中,紧接引号(中间没有空格)之后的字母被标记为用户定义的字符串文字。
  • 最后一个L从来没有必要,因为可以将宽字符串文字与窄字符串文字连接起来(产生宽字符串文字)