Что это: L "DLGCTRL_" L # dialog_control_id - PullRequest
0 голосов
/ 20 декабря 2018

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

L"DLGCTRL_"L#dialog_control_id

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

Я получаю ошибку:

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

У меня Visual Studio 2015 и 2017 на Windows 10. Он обычно компилируется на C ++ 98 или 00

1 Ответ

0 голосов
/ 20 декабря 2018

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

#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# не допускается в ISOC ++, это расширение препроцессора Microsoft для создания широкого строкового литерала.
  • В препроцессоре C ++ 11 буква сразу после закрывающей кавычки (без пробела между ними) маркируется как пользовательскаяопределенный строковый литерал.
  • Последний L никогда не был необходим, так как широкий строковый литерал может быть объединен с узким строковым литералом (производящим широкий строковый литерал)
...