БлогNot. Visual C++: используем _CRT_SECURE_NO_WARNINGS для совместимости с классическими...

Visual C++: используем _CRT_SECURE_NO_WARNINGS для совместимости с классическими функциями

Часто жалуются на "неработающие" коды, особенно консольных приложений или CLR, особенно тех, что работали без каких-либо замечаний в версиях 2010-2013 и вдруг "не работают" в 2015, например, вот этот код.

Выдаются ошибки типа

Ошибка C4996 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.

Можете, как и рекомендует компилятор, заменить старые названия функций на их безопасные версии, скажем, strcpy на strcpy_s и fopen на fopen_s.

Правда, в последнем случае изменится и "классический" оператор открытия файла, скажем, с

FILE *out = fopen_s("data.txt", "wt");

на

FILE *out; fopen_s(&out,"data.txt", "wt");

Суть дела в том, что функции, возвращающие указатель, считаются небезопасными, отсюда и изменившийся шаблон метода открытия файла.

Есть путь ещё проще - напишите

#define _CRT_SECURE_NO_WARNINGS

в самом начале до всех #include.

Если используется предкомпиляция, то можно определить этот макрос в заголовочном файле stdafx.h.

Можно также попробовать "дорисовать" его не в заголовках, а в настройках проекта.

Управление предкомпилированными заголовками находится вот где: меню Проект - Свойства C/C++ - Препроцессор (Preprocessor) - Определения препроцессора (Preprocessor Definitions).

Проверено на пустом проекте C++ Visual Studio 2015, 2019, сработало.

Некоторым функциям директива "не поможет", например, stricmp всё равно придётся заменять но _stricmp, правда, без изменения списка аргументов.

Заметим, что по стандартам C++ функции strcpy, strcat и другие не устарели, это собственная политика Microsoft.

13.10.2015, 11:48 [107392 просмотра]


теги: c++ ошибка памятка studio безопасность

К этой статье пока нет комментариев, Ваш будет первым