[[устарело]] приводит к сбою сборки в VS2017 (ошибка C4996) - PullRequest
3 голосов
/ 05 марта 2019
[[deprecated]]
void foo(){};

int main()
{
    foo();
}

Приведенный выше код выдает следующую ошибку в VS2017:

1>------ Build started: Project: test, Configuration: Debug Win32 ------
1>deprecation.cpp
1>d:\source\deprecation.cpp(6): error C4996: 'foo': was declared deprecated
1>d:\source\deprecation.cpp(2): note: see declaration of 'foo'
1>Done building project "test.vcxproj" -- FAILED.
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

К сожалению, поиск этой ошибки приводит к появлению множества «как использовать [[устаревшее]]» и «какие функцииустарели?вопросы стиля.

Кажется, что каждый ресурс, который я проверяю, предполагает, что использование [[deprecated]] должно быть так же просто, как написано выше - ожидается ошибка / предупреждение компилятора, но не ошибка сборки.Закомментирование строки [[не рекомендуется]] приводит к успешной сборке.

Проект ориентирован на Windows SDK версии 10.0.17763.0.

cl.exe версия 19.16.27027.

Я упустил что-то очевидное при использовании [[устарело]], или VS2017 находит способ его сломать?

1 Ответ

7 голосов
/ 05 марта 2019

Вместо сообщения об ошибке выдается предупреждение, так как включена проверка SDL. Похоже, в VS17 SDL включен по умолчанию. От Документ :

/ sdl включает эти предупреждения как ошибки :

C4146 / we4146 Унарный оператор минус был применен к типу без знака, в результате получается неподписанный результат.

C4308 / we4308 Отрицательная интегральная константа, преобразованная в беззнаковое типа, что может привести к бессмысленному результату.

C4532 / we4532 Использование ключевых слов continue, break или goto в __finally / наконец блок имеет неопределенное поведение во время аварийного завершения.

C4533 / we4533 Код, инициализирующий переменную, не будет выполнен.

C4700 / we4700 Использование неинициализированной локальной переменной.

C4703 / we4703 Использование потенциально неинициализированного локального указателя переменная.

C4789 / we4789 Переполнение буфера при определенном времени выполнения C (CRT) функции используются.

C4995 / we4995 Использование функции, отмеченной прагмой, устарело.

C4996 / we4996 Использование функции, помеченной как устаревшая.

Чтобы исправить, перейдите в «Свойства» -> «C / C ++» -> «Проверки SDL», установите «Нет (/ sdl-)». После этого вы получите

: warning C4996: 'foo': was declared deprecated
: note: see declaration of 'foo'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...