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를 써보는 것도...
- #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에 보면 메시지 맵이 매크로 함수로 되어 있다.
- 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)
... - CHAIN_MSG_MAP(CUpdateUI<CMainFrame>)
CHAIN_MSG_MAP(CFrameWindowImpl<CMainFrame>)
END_MSG_MAP()
본문에 가보면
- #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; \
}
\로 구분되어 있어 알아 보기 편하게 되어 있다.
그전에는 매크로 함수는 항상 한줄에 쭉 써야 하는 줄 알고 있었는데 역슬래시를 이용하면 되는 것이었구나..
라이브러리 파일 지시문으로 추가하기
만약 윈속(윈도우 소켓) 프로그래밍을 한다면 코드상단에 아래의 인크루드가 있을 것이다.
-
#include <winsock2.h>
하지만 컴파일 할 때 ws2_32.lib 라이브러리 파일과 링크가 되야 한다.
프로젝트 속성(property)에서 추가를 해줄 수도 있지만 매번 프로젝트에 추가 해주는 것은 번거로울 수 있다.
아래의 코드를 이용하면 된다. (나의 경우는 .h에 nclude를 넣고, .cpp에 아래 코드를 넣어둔다.)
-
#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는 표준에도 없는 함수를 만들어서 쓰라고 한다.ㅡㅡ;;
- #pragma warning (disable:4996)
deprecate 경고 없애기
비주얼 스듀디오 2005인가 부터 문자열 연산 함수(예. strcpy, strcat 등)을 사용할 때 "_s"가 붙은 안전한(?) 함수를 사용하라고 하는데,
그런 경고 메시지를 보고 싶지 않으면 서두에 아래의 문장을 써놓는다.
-
#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
- #ifndef _WINSOCKAPI_
#define _WINSOCKAPI_ /* Prevent inclusion of winsock.h in windows.h */
#endif
#include <windows.h>
windows.h 용량 줄이기
- #ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN // 거의 사용되지 않는 내용은 Windows 헤더에서 제외합니다. - #endif
#include <windows.h>
[출처] scanf_s를 쓰라고 권고하는 visual studio 등등|작성자 개리
'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 |