비주얼 스튜디오를 처음 사용하는 분들이라면 이 현상을 겪어보셨을 겁니다.
아래와 같은 코드를 짠 후
분명 코드는 문법상 오류가 없습니다 하지만 컴파일을 돌리면?
에러코드 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.
라는 설명과 함께 오류가 발생하여 빌드가 되지 않죠.
이게 무슨 소리냐면 scanf가 안전하지 않으므로 scanf_s를 쓰거나 _CRT_SECURE_NO_WARNINGS를 이용하라고 합니다.
scanf가 안전하지 않은 이유는 scanf가 받을 수 있는 입력 데이터의 크기가 있는데 사용자가 고의로 또는 실수로 해당 데이터 크기를 초과하는 값을 입력할 경우 초과된 데이터가 다른 메모리를 침범해 프로그램에 오류가 발생할 수 있기 때문에 이를 막기 위해 scanf_s로 일정 크기까지만 입력받는 함수를 사용하라고 권장하는 것입니다.
해결 방법
먼저 여러가지 해결 방법이 존재합니다.
1. scanf_s (비추천)
2. #define _CRT_SECURE_NO_WARNINGS (추천)
3. #pragma warning(disable:4996)
4. SDL(Security Development Lifecycle) 검사 끄기
1. scanf_s
먼저 해당 현상은 비주얼 스튜디오에서만 뜨는 오류입니다. 설명에 적힌 대로 scanf_s를 쓰면 해결이 되기는 하지만 비주얼 스튜디오에서만 사용되는 비표준 함수이므로 비주얼 스튜디오가 아닌 다른 편집기에서는 컴파일 오류가 납니다. 그래서 저는 이 방법은 추천드리지 않습니다..!
2. #define _CRT_SECURE_NO_WARNINGS (추천)
코드의 맨 앞줄에 해당 코드를 정의해두면 scanf 오류가 감쪽같이 사집니다.
※꼭 코드의 최상단에 적어야 합니다!
빌드 성공 화면
3. #pragma warning(disable:4996)
2번과 비슷하게 이것도 코드의 맨 앞줄에 #pragma warning(disable:4996)를 적어두면 scanf 오류가 사라집니다. 2번과 3번 어차피 비슷한 방식인데 2번을 외워두시는 거 추천드려요.
빌드 성공 화면
4. SDL(Security Development Lifecycle) 검사 끄기
scanf 오류가 나는 이유가 보안 문제인데 보안 검사를 꺼버리면 scanf 오류도 사라집니다.
먼저 해당 소스파일을 우클릭해 속성을 들어가줍니다.
구성 속성 -> C/C++ -> 일반 탭을 눌러줍니다.
여기서 SDL 검사를 아니요로 바꿔준 후
빌드 성공!
코드를 돌려보면 오류가 없습니다.
지금까지 4가지의 방법을 알려드렸는데 저는 개인적으로 2번을 제일 자주 사용합니다. (그리고 가장 많이들 사용하는 방식입니다)
1번은 비추천 드리는 방식이에요
도움이 많이 되셨나요? 또 궁금한 점이 있으시면 댓글로 질문 남겨주세요!!