Сведения о вопросе

DUNKER

22:08, 22nd August, 2020

Теги

fopen устаревшее предупреждение

Просмотров: 979   Ответов: 10

В компиляторе Visual Studio 2005 C++ я получаю следующее предупреждение, когда мой код использует fopen и такие вызовы.

1>foo.cpp(5) : warning C4996: 'fopen' was declared deprecated
1>        c:\program files\microsoft visual studio 8\vc\include\stdio.h(234) : see declaration of 'fopen'
1>        Message: 'This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_DEPRECATE. See online help for details.'

Как мне это предотвратить?



  Сведения об ответе

PIRLO

13:30, 22nd August, 2020

Похоже, что Microsoft устарело множество вызовов, которые используют буферы для повышения безопасности кода. Однако предлагаемые ими решения не являются портативными. В любом случае, если вы не заинтересованы в использовании защищенной версии их вызовов (например, fopen_s), вам нужно поместить определение _CRT_SECURE_NO_DEPRECATE перед включенными заголовочными файлами. Например:

#define _CRT_SECURE_NO_DEPRECATE
#include <stdio.h>

Директива препроцессора также может быть добавлена в настройки проекта, чтобы применить ее ко всем файлам проекта. Для этого добавьте _CRT_SECURE_NO_DEPRECATE в свойства проекта - > свойства конфигурации -> C/C++ - > препроцессор - > определения препроцессора .


  Сведения об ответе

VCe znayu

03:01, 1st August, 2020

Ну вы могли бы добавить а:

#pragma warning (disable : 4996)

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

Проблема с простым отключением устаревших предупреждений функций заключается в том, что Microsoft может удалить рассматриваемую функцию в более поздней версии CRT, нарушив ваш код (как указано ниже в комментариях, это не произойдет в данном случае с fopen, потому что это часть стандартов C & C++ ISO).


  Сведения об ответе

darknet

03:21, 3rd August, 2020

Это просто дерзость Microsoft. "Deprecated" подразумевает языковую функцию, которая не может быть предусмотрена в будущих версиях стандартного языка / стандартных библиотек, как это предписано комитетом по стандартам. Это не означает или не должно означать: "мы, в одностороннем порядке, не думаем, что вы должны использовать его", независимо от того, насколько обоснован этот совет.


  Сведения об ответе

P_S_S

21:09, 4th August, 2020

Если ваш код предназначен для другого OS (например, Mac OS X, Linux) , вы можете использовать следующее:

#ifdef _WIN32
#define _CRT_SECURE_NO_DEPRECATE
#endif


  Сведения об ответе

LIZA

10:47, 6th August, 2020

Рассмотрите возможность использования библиотеки переносимости, такой как glib или apache portable runtime . Они, как правило, обеспечивают безопасный, портативный Альтернативы для звонков, как эти. Это тоже хорошо, потому что эти небезопасные вызовы устарели в большинстве современных сред.


  Сведения об ответе

DINO

04:53, 21st August, 2020

Я использую VisualStdio 2008. В этом случае я часто ставлю Preprocessor Definitions

Свойства Меню \ Project \ [ProjectName]... Alt+F7

Если щелкнуть это меню или нажать Alt + F7 в окне проекта, вы увидите окно "Property Pages".

Затем смотрите меню слева от окна.

Свойства Конфигурации \ C/C++ \ Препроцессор

Затем добавьте _CRT_SECURE_NO_WARNINGS в \ Preprocessor Definitions .


  Сведения об ответе

#hash

07:51, 26th August, 2020

Если вы хотите, чтобы он был использован на многих платформах, вы можете использовать его в качестве комментария, например:

#if defined(_MSC_VER) || defined(WIN32)  || defined(_WIN32) || defined(__WIN32__) \
                        || defined(WIN64)    || defined(_WIN64) || defined(__WIN64__) 

        errno_t err = fopen_s(&stream,name, "w");

#endif

#if defined(unix)        || defined(__unix)      || defined(__unix__) \
                        || defined(linux)       || defined(__linux)     || defined(__linux__) \
                        || defined(sun)         || defined(__sun) \
                        || defined(BSD)         || defined(__OpenBSD__) || defined(__NetBSD__) \
                        || defined(__FreeBSD__) || defined __DragonFly__ \
                        || defined(sgi)         || defined(__sgi) \
                        || defined(__MACOSX__)  || defined(__APPLE__) \
                        || defined(__CYGWIN__) 

        stream = fopen(name, "w");

#endif


  Сведения об ответе

nYU

16:00, 17th August, 2020

Многие из защищенных функций Microsoft, включая fopen_s(), являются частью C11, поэтому теперь они должны быть переносимыми. Вы должны понимать,что защищенные функции отличаются поведением исключений и иногда возвращаемыми значениями. Кроме того, вы должны знать, что, хотя эти функции стандартизированы, это необязательная часть стандарта (приложение K), которую по крайней мере glibc (по умолчанию на Linux) и FreeBSD libc не реализуют.

Однако я боролся с этой проблемой в течение нескольких лет. Я разместил здесь больший набор конверсий macros. Для решения вашей непосредственной проблемы поместите следующий код во включаемый файл и включите его в исходный код:

#pragma once
#if !defined(FCN_S_MACROS_H)
   #define   FCN_S_MACROS_H

   #include <cstdio>
   #include <string> // Need this for _stricmp
   using namespace std;

   // _MSC_VER = 1400 is MSVC 2005. _MSC_VER = 1600 (MSVC 2010) was the current
   // value when I wrote (some of) these macros.

   #if (defined(_MSC_VER) && (_MSC_VER >= 1400) )

      inline extern
      FILE*   fcnSMacro_fopen_s(char *fname, char *mode)
      {  FILE *fptr;
         fopen_s(&fptr, fname, mode);
         return fptr;
      }
      #define fopen(fname, mode)            fcnSMacro_fopen_s((fname), (mode))

   #else
      #define fopen_s(fp, fmt, mode)        *(fp)=fopen( (fmt), (mode))

   #endif //_MSC_VER

#endif // FCN_S_MACROS_H

Конечно, этот подход не реализует ожидаемое поведение исключения.


  Сведения об ответе

JUST___

23:00, 19th August, 2020

Для тех, кто использует версию Visual Studio 2017, похоже, что определение препроцессора, необходимое для выполнения небезопасных операций, изменилось. Используйте вместо этого:

#define _CRT_SECURE_NO_WARNINGS

Тогда он будет компилироваться.


  Сведения об ответе

prince

05:57, 26th August, 2020

У меня тоже была такая же проблема. Когда я пытаюсь добавить библиотеку opencv

#include <opencv\cv.h>

Я получил не предупреждение, а ошибку.

error C4996: 'fopen': This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.    c:\program files (x86)\opencv\build\include\opencv2\flann\logger.h  

Я также использовал директивы препроцессора, как уже упоминалось. Но это не решило проблему.

Я решил ее следующим образом:

  • Перейдите в свойства - > C/C++ -> предварительно скомпилированные заголовки - > Выберите не использовать предварительно скомпилированные заголовки в предварительно скомпилированном заголовке.


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться