Не отключаются по инструкции Microsoft мешающие ключевые слова

Рейтинг: 1Ответов: 3Опубликовано: 22.01.2023

Имеется большой legacy проект. При компиляции с 20-м стандартом ругается на имена функций or и and, которые на кой-то ляд сделали ключевыми словами. На сайте Microsoft https://learn.microsoft.com/en-us/cpp/cpp/logical-or-operator-pipe-pipe?view=msvc-160 написано, что данные слова в силе только если в настройках проекта поставлено /permissive- (режим совместимости: да) ИЛИ /Za (отключить расширения языка: да). Разумеется, я режим совместимости и расширения языка выставил в нет, но всё равно не компилируется!

error C2059: синтаксическая ошибка: ||

Когда я отключил вышеуказанное, имена этих функций обрели подсветку как у других, словно теперь эти слова стали расцениваться Intellisense как имена. Но компилятор так не думает. И кстати макросами они не считаются, если верить Intellisense.

Как это решить? Исправлять имя символа очень трудозатратно, придётся перелопатить все исходники, которые писал тем более не я. А 20-й стандарт очень хочется.

Ответы

▲ 1Принят

Тут https://learn.microsoft.com/ru-RU/cpp/build/reference/permissive-standards-conformance?view=msvc-150 интересно сказано, что /permissive должен находиться после любого параметра, который задает /permissive- неявно. В компилируемом проекте множество настроек не по умолчанию, глядишь, что-то к этим неявно задающим и относится. Я в VS в разделе "Командная строка" в поле "Дополнительные параметры" повторил установленный /permissive. Получилось, что оно идёт после всех параметров командной строки и поэтому "последнее слово" за /permissive. И действительно, после этого ошибки с or/and ушли (и появились другие, сложные, внутри используемой древней версии boost =), но это уже совсем другая история).

▲ 2

Как пишут сами Microsoft, достаточно применить /permissive.

Чтобы не было утверждений, что это не так, вот как это выглядит в VC++2019 — тут и исходный текст, и два варианта компиляции...

введите сюда описание изображения

▲ 1

or и and присоединились к пачке ключевых слов уже давно, и каждый новый стандарт насыпает еще. /permissive является достаточно грубым костылем, единственной задачей которого является обеспечить работоспособность legacy кода, при этом делающим невозможным полноценное использование новых стандартов. Так что проект придется переделывать. Но это по большей части только косметическая проблема, достаточно легко решаемая посредством замены текста.

А вот среди другие ожидающих вас сюрпризов есть переход на связывание независимых имен при разборе шаблонов, меняющая поведение кода, рассчитывающего на нестандартный поздние связывание, и реализация гарантированных оптимизаций при разных действиях с prvalue объектами и возврате из функций, ломающая код, рассчитывающий на побочные эффекты от вызова конструкторов/деструкторов.