MSVC2017 - ключи компилятора для следования стандарту
От: Constructor  
Дата: 29.11.17 15:02
Оценка: 166 (11) +1
#Имя: FAQ.cpp.msvc-commandline
Здравствуйте, nullptr_rs, Вы писали:

C>>И в godbolt, и в webcompiler я использовал ключ /permissive-. В первом случае предупреждение еще выдается, во втором — уже нет. Попробуйте и у себя этот ключ на всякий случай.


_>Отдельный ключ для более полного соответствия стандарту? Забавно, но проблему, похоже, решает. Спасибо


Это "новый" ключ. Причем он пока даже не добавлен в визуальный интерфейс (настройки проекта). Есть еще "старый" ключ /Za.

Вообще, на тропу войны с современным Visual C++ (имеется в виду Visual Studio 2017 и ее update'ы) я бы не выходил без чего-то вроде следующего:

  1. /stdSpecify Language Standard Version (на выбор по вкусу):
    • /std:c++14
    • /std:c++17
    • /std:c++latest
  2. /ZaDisable language extensions (отключает некоторые расширения компилятора Visual C++ [довольно ограниченное количество], не соответствующие стандарту языка);
  3. /ZcConformance (флаги этого семейства приводят в соответствие со стандартом отдельные аспекты компиляции C++ кода [флаги, которые включены по умолчанию, я не упоминаю]):
    • /Zc:externConstexprEnable extern constexpr variables (начиная с Visual Studio 2017 Update 15.5);
    • /Zc:inlineRemove unreferenced COMDAT (по стандарту тело inline-функции должно быть определено в той же единице трансляции, где она используется);
    • /Zc:referenceBindingEnforce reference binding rules (запрещает привязывание временных объектов к неконстантным ссылкам [неявно включается /permissive-]);
    • /Zc:rvalueCastEnforce type conversion rules;
    • /Zc:strictStringsDisable string literal type conversion (указывать на строковый литерал могут только указатели на константу);
    • /Zc:throwingNewAssume operator new throws;
  4. /permissive-ISO C++ Conformance (приблизительный аналог флага -pedantic в clang++ и g++);
  5. Предупреждения компилятора:
    • /Wall — выкручиваем уровень предупреждений на максимум (соответствует 4-му уровню предупреждений с некоторыми дополнительными предупреждениями, которые отключены по умолчанию);
    • /WX — превращаем все предупреждения в ошибки компиляции;
    • /wd — отключаем некоторые наиболее бесполезные и бессмысленные предупреждения, задавая их номера (по вкусу):
      /wd"4514"'function' : unreferenced inline function has been removed;
      /wd"4710"'function' : function not inlined;
      /wd"4711"function 'function' selected for inline expansion;
      /wd"4820"'bytes' bytes padding added after construct 'member_name';
      /wd"4868"'file(line_number)' compiler may not enforce left-to-right evaluation order in braced initializer list;
    • /D "_STL_WARNING_LEVEL=3" — запрещаем применять к заголовочным файлам стандартной библиотеки предупреждения выше 3-го уровня (чтобы связка ключей /Wall /WX не нападала на них; к сожалению, заголовочные файлы стандартной библиотеки, поставляемой вместе с Visual C++, по-прежнему выдают огромное число предупреждений, если задать /W4 или /Wall, но с 3-м уровнем предупреждений товарищи из Microsoft вроде бы справились);
  6. /EHscException Handling Model (приводим используемую модель обработки исключений в соответствие с требованиями стандарта);
  7. /sdlEnable Additional Security Checks.

_>В общем-то найти workaround не проблема. Но баги кодогенератора печалят


В компиляторе от Microsoft до сих пор такое количество багов, что это должно не печалить, а веселить. Впрочем, в clang++ и g++ багов тоже предостаточно.

09.12.17 16:21: Ветка выделена из темы MSVC2017 — ключи компилятора для следования стандарту
Автор: nullptr_rs
Дата: 29.11.17
— Кодт
Отредактировано 09.12.2017 13:20 Кодт . Предыдущая версия . Еще …
Отредактировано 09.12.2017 12:33 Кодт . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.