C Language

scanf_s를 쓰라고 권고하는 visual studio 등등

또하나의세상2 2012. 3. 2. 21:31

This function or variable may be unsafe. Consider using fscanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.

studio 2010  짱난다

구현을 차후로 미루고 싶다면 #error를 써보는 것도...

  1. #ifndef _UNICODE
     #error ANSI version is not implemented...
    #endif 

 

전처리기와 매크로 함수 : http://myhome.hanafos.com/~kukdas/doc/c_lect/c_lect-8.html

 

매크로 함수

매크로로 맵 만들기

if() ~ 로 이어지는 것을 일일이 코딩하는 것은 번거롭다.

WTL에 있는 MAP을 따라해보자.

MainFrm.h에 보면 메시지 맵이 매크로 함수로 되어 있다.

  1. BEGIN_MSG_MAP(CMainFrame)
            MESSAGE_HANDLER(WM_CREATE, onCreate)
            MESSAGE_HANDLER(WM_DESTROY, onDestroy)
            COMMAND_ID_HANDLER(ID_APP_EXIT, onFileExit)
            COMMAND_ID_HANDLER(ID_FILE_NEW, onFileNew)
    ...
  2.        CHAIN_MSG_MAP(CUpdateUI<CMainFrame>)
            CHAIN_MSG_MAP(CFrameWindowImpl<CMainFrame>)
        END_MSG_MAP()

본문에 가보면

  1. #define COMMAND_ID_HANDLER(id, func) \
        if(uMsg == WM_COMMAND && id == LOWORD(wParam)) \
        { \
            bHandled = TRUE; \
            lResult = func(HIWORD(wParam), LOWORD(wParam), (HWND)lParam, bHandled); \
            if(bHandled) \
                return TRUE; \
        }

\로 구분되어 있어 알아 보기 편하게 되어 있다.

그전에는 매크로 함수는 항상 한줄에 쭉 써야 하는 줄 알고 있었는데 역슬래시를 이용하면 되는 것이었구나..

라이브러리 파일 지시문으로 추가하기

만약 윈속(윈도우 소켓) 프로그래밍을 한다면 코드상단에 아래의 인크루드가 있을 것이다.

  1. #include <winsock2.h>

하지만 컴파일 할 때 ws2_32.lib 라이브러리 파일과 링크가 되야 한다.

프로젝트 속성(property)에서 추가를 해줄 수도 있지만 매번 프로젝트에 추가 해주는 것은 번거로울 수 있다.

아래의 코드를 이용하면 된다. (나의 경우는 .h에 nclude를 넣고, .cpp에 아래 코드를 넣어둔다.)

  1. #pragma comment(lib, "ws2_32.lib")

 

#pragma once

#pragma once는 컴파일러 (정확히는 preprocessor겠지요)에게 이 파일은 한번만 읽어들이라고 지시하는 것

클래스 헤더파일 선언을 마법사로 만들면 앞에 붙게 된다.

경고 없애기

warning 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.

즉, _s 가 붙은 비표준 함수를 쓰라는 것이다. visual studio는 표준에도 없는 함수를 만들어서 쓰라고 한다.ㅡㅡ;;

  1. #pragma warning (disable:4996)

 

 

deprecate 경고 없애기

비주얼 스듀디오 2005인가 부터 문자열 연산 함수(예. strcpy, strcat 등)을 사용할 때 "_s"가 붙은 안전한(?) 함수를 사용하라고 하는데,

그런 경고 메시지를 보고 싶지 않으면 서두에 아래의 문장을 써놓는다.

  1. #pragma warning(disable : 4996)

 

그외 경로 레벨 조정하기

#pragma warning(disable : 4668)    // is not defined as a preprocessor macro, replacing with '0' for '#if/#elif
#pragma warning(disable : 4820)    // padding added after member
#pragma warning(disable : 4917)    // a GUID can only be associated with a class, interface or namespace
#pragma warning(disable : 4217)    // member template functions cannot be used for copy-assignment or copy-construction
#pragma warning(disable: 4127) // constant expression
#pragma warning(disable: 4097) // typedef name used as synonym for class-name
#pragma warning(disable: 4786) // identifier was truncated in the debug information
#pragma warning(disable: 4291) // allow placement new
#pragma warning(disable: 4201) // nameless unions are part of C++
#pragma warning(disable: 4103) // pragma pack
#pragma warning(disable: 4268) // const static/global data initialized to zeros

#pragma warning (push)
#pragma warning(disable: 4571) //catch(...) blocks compiled with /EHs do NOT catch or re-throw Structured Exceptions

 

#pragma warning(disable : 4996)

2. 경고 C4996권장되지 않는 함수 사용에 관한 경고입니다.

scanf는, MS가 지정한 잘못 쓰면 안전하지 않은 일이 발생할 수도 있는 함수들 중 하나입니다.

그러나, 문제에서처럼 %d %f 같은 고정폭 변수만을 받아오는 경우에는 문제가 안 됩니다.

진짜 문제는 %c, %s류 입력들입니다. 버퍼 오버플로우가 발생할 수 있는 배열 입력이니까요.

이런 입력들에 대해 버퍼 크기를 지정하기 위해 MS는 scanf_s를 쓰라고 권고합니다.

하지만, scanf_s는 C++ 표준 문법이 아니므로 저 에러를 잘라버립시다.

어떻게 하냐고요?

코드에서 모든 헤더를 #include 한 뒤 이렇게 적으면 됩니다.

#pragma warning( disable : 4996 )

혹은,

#define _CRT_SECURE_NO_WARNINGS

 

출처 : 네이버

C4996은 경고 수준 1이다 - okw1003

 

winsock.h 중복 재정의 에러

원인windows.h 가 구버전의 winsock.h 를 포함하고 있기 때문이다.

해결방법#include <windows.h > 문장 위에 아래 문장을 추가해 준다.

#ifndef _WINSOCKAPI_

#define _WINSOCKAPI

#endif

출처 : http://elky.tistory.com/146

 

  1. #ifndef _WINSOCKAPI_
    #define _WINSOCKAPI_  /* Prevent inclusion of winsock.h in windows.h */
    #endif
    #include <windows.h>

 

windows.h 용량 줄이기

  1. #ifndef WIN32_LEAN_AND_MEAN
    #define WIN32_LEAN_AND_MEAN             // 거의 사용되지 않는 내용은 Windows 헤더에서 제외합니다.
  2. #endif
    #include <windows.h>

'C Language' 카테고리의 다른 글

shellsort  (0) 2012.03.06
insertsort  (0) 2012.03.06
magicsquare  (0) 2012.03.06
slantline  (0) 2012.03.06
snail  (0) 2012.03.06