Что это: LDLGCTRL_L#dialog_control_id

Я нашел это в каком-то коде C++_11:

L"DLGCTRL_"L#dialog_control_id

Что такое "L#" здесь? Нет оператора # или конкатенации. Да, между " и L ничего нет. Как это можно допустить?

Я получаю сообщение об ошибке:

ошибка C3688: неверный литеральный суффикс 'L'; литеральный оператор или шаблон литерального оператора 'оператор "L" не найден

У меня есть Visual Studio 2015 и 2017 в Windows 10. Он нормально компилируется на С++ 98 или 00.


person user4576528    schedule 19.12.2018    source источник
comment
Опубликуйте MCVE и объясните, что вы подразумеваете под компиляцией в обычном режиме на C++98 или 00. C++98 является языковым стандартом , а не компилятор   -  person M.M    schedule 20.12.2018


Ответы (1)


Я предполагаю, что это происходит внутри макроса препроцессора, иначе вопрос вообще не имеет смысла, например:

#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 в любом случае никогда не был необходим, потому что широкий строковый литерал может быть объединен с узким строковым литералом (создавая широкий строковый литерал)
person M.M    schedule 20.12.2018
comment
Мне тоже было интересно, что это за L. Очевидно, что это часть стратегии MSFT Embrace, Extend, Extinguish. - person J. Doe; 01.10.2019
comment
@ J.Doe, первый L является частью стандарта C++, это означает, что строковый литерал представляет собой массив const wchar_t. Комбинация L# является расширением Microsoft - person M.M; 02.10.2019