문제

~에 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.'

이를 방지하려면 어떻게 해야 합니까?

도움이 되었습니까?

해결책

Microsoft는 코드 보안을 향상시키기 위해 버퍼를 사용하는 많은 호출을 더 이상 사용하지 않는 것 같습니다.그러나 그들이 제공하는 솔루션은 이식성이 없습니다.어쨌든, 통화의 보안 버전을 사용하는 데 관심이 없다면(예: fopen_s), 다음을 정의해야 합니다. _CRT_SECURE_NO_DEPRECATE 포함된 헤더 파일 앞에.예를 들어:

#define _CRT_SECURE_NO_DEPRECATE
#include <stdio.h>

전처리기 지시문을 프로젝트 설정에 추가하여 프로젝트 아래의 모든 파일에 적용할 수도 있습니다.이렇게 하려면 추가하세요. _CRT_SECURE_NO_DEPRECATE 에게 프로젝트 속성 -> 구성 속성 -> C/C++ -> 전처리기 -> 전처리기 정의.

다른 팁

다음을 추가할 수 있습니다.

#pragma warning (disable : 4996)

fopen을 사용하기 전에 경고에서 알 수 있듯이 fopen_s 사용을 고려해 보셨나요?함수 호출 결과를 확인할 수 있는 오류 코드를 반환합니다.

더 이상 사용되지 않는 함수 경고를 비활성화하는 것의 문제는 Microsoft가 CRT의 최신 버전에서 문제의 함수를 제거하여 코드를 손상시킬 수 있다는 것입니다(아래 주석에 설명된 대로 fopen의 일부이기 때문에 이 인스턴스에서는 이런 일이 발생하지 않습니다). C & C++ ISO 표준).

이것은 단지 Microsoft가 건방진 것입니다."더 이상 사용되지 않음"은 표준 위원회에서 결정한 대로 표준 언어/표준 라이브러리의 향후 버전에서 제공되지 않을 수 있는 언어 기능을 의미합니다.그 조언이 아무리 근거가 충분하더라도 "우리는 일방적으로 귀하가 그것을 사용해서는 안된다고 생각합니다"를 의미하지도 않고 의미해서도 안됩니다.

코드가 다른 OS(예: Mac OS X, Linux)용인 경우 다음을 사용할 수 있습니다.

#ifdef _WIN32
#define _CRT_SECURE_NO_DEPRECATE
#endif

다음과 같은 이식성 라이브러리 사용을 고려해보세요. 말 잘하는 아니면 그 아파치 휴대용 런타임.이는 일반적으로 이와 같은 통화에 대한 안전하고 이식 가능한 대안을 제공합니다.이는 또한 좋은 일입니다. 왜냐하면 이러한 안전하지 않은 호출은 대부분의 최신 환경에서 더 이상 사용되지 않기 때문입니다.

저는 VisualStdio 2008을 사용하고 있습니다.이 경우에는 자주 설정합니다. Preprocessor Definitions

메뉴 \ 프로젝트 \ [프로젝트 이름] 속성...Alt+F7

이 메뉴를 클릭하거나 프로젝트 창에서 Alt + F7을 누르면 다음과 같은 모습을 볼 수 있습니다. "속성 페이지" 창문.

그런 다음 창 왼쪽의 메뉴를 참조하십시오.

구성 속성 \ C/C++ \ 전처리기

그런 다음 추가 _CRT_SECURE_NO_WARNINGS 에게 \ 전처리기 정의.

많은 플랫폼에서 사용하려면 다음과 같이 주석으로 use 정의할 수 있습니다.

#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

Visual Studio 2017 버전을 사용하시는 분들은 안전하지 않은 작업을 실행하는 데 필요한 전처리기 정의가 변경된 것 같습니다.대신 사용하세요:

#define _CRT_SECURE_NO_WARNINGS

그러면 컴파일됩니다.

fopen_s()를 포함한 많은 Microsoft 보안 기능은 C11의 일부이므로 이제 이식 가능해야 합니다.보안 함수는 예외 동작과 때로는 반환 값이 다르다는 점을 인식해야 합니다.또한 이러한 기능은 표준화되어 있지만 선택 과목 최소한 glibc(Linux의 기본값)와 FreeBSD의 libc가 구현하지 않는 표준(부속서 K)의 일부입니다.

그러나 나는 이 문제로 몇 년 동안 싸웠다.더 많은 변환 매크로 세트를 게시했습니다. 여기., 즉각적인 문제의 경우 다음 코드를 포함 파일에 넣고 소스 코드에 포함하십시오.

#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

물론 이 접근 방식은 예상되는 예외 동작을 구현하지 않습니다.

나도 같은 문제가 발생했습니다.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++ -> 미리 컴파일된 헤더 -> 미리 컴파일된 헤더에서 미리 컴파일된 헤더를 사용하지 않음을 선택합니다.
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top