c++ - 这是什么: L"DLGCTRL_"L#dialog_control_id

标签 c++ string literals suffix

我在一些 C++_11 代码中发现了这一点:

L"DLGCTRL_"L#dialog_control_id

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

我收到错误:

error C3688: invalid literal suffix 'L'; literal operator or literal operator template 'operator ""L' not found

我在 Windows 10 上安装了 Visual Studio 2015 和 2017。 它在 C++98 或 00 上正常编译

最佳答案

我假设这发生在预处理器宏内部,否则这个问题根本没有意义,例如:

#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 无论如何都不是必需的,因为宽字符串文字可以与窄字符串文字连接(生成宽字符串文字)

关于c++ - 这是什么: L"DLGCTRL_"L#dialog_control_id,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53860644/

相关文章:

c++ - 无法将参数从 int * 转换为 const int *&

java - 如何使用前面没有转义字符的字符分割java字符串

ruby - 为什么百分号中使用不同的分隔符?

C++11 运算符""带双参数

c++ - gtkmm中的图像异步加载

c++ - 在 C++ 中查看 system() 调用的输出

java - http响应中断的字符串? - Java, Android 3.0 平台

c - 是否有不需要空终止字符串的 strtol 等价物?

c++ - 使用预处理器制作用户定义的文字

c++ - 库上的静态变量初始化