C4996 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
그저 과제를 풀 뿐임에도, 마이크로소프트는 보안 상의 이유로 scanf 대신 scanf_s를 쓰라고 강요한다.
막상 scanf_s로 바꾸면 백준에서 또 컴파일 에러가 난다. 귀찮은 이 에러를 해결하는 법을 알아보자.
1. scanf_s 사용하기
당연하지만 가장 쉬운 방법은, scanf_s를 사용하는 것이다.
다만 scanf_s를 사용하면 백준 등 다른 컴파일러에 사용할 땐 컴파일 에러가 난다. 상당히 귀찮다. 현업 파일이 아니라면 그닥 좋지 않다.
2. 프로젝트 전처리기 설정 변경
다음은 프로젝트 전체에 적용하는 방법이다.
프로젝트 - "프로젝트 이름" 속성에 들어가자.
구성 속성 - C/C++ - 전처리기 - 전처리기 정의를 찾아주자.
이미 있는 문구 뒤에
;_CRT_SECURE_NO_WARNINGS
을 입력해주면, 더 이상 해당 에러가 나타나지 않는다.
명령어의 뜻은?
맨 앞의 ;는 각 심볼을 구분하는 구분자다. 앞에 쓴 정의도 적용하고, 추가로 뒷 문장도 적용하겠다는 뜻이다.
_CRT_SECURE_NO_WARNINGS는 비주얼 스튜디오 컴파일러가 띄우는 경고 메세지를 무시한다는 디렉티브다. 보안 상의 위험은 그래도지만, 경고 메세지를 띄우지 않겠다는 의미다. 따라서 비교적 보안이 중요하지 않은 상황(코테, 과제 등)에 쓰는 게 좋다.
3. #define _CRT_SECURE_NO_WARNINGS
다음으로, 소스 코드 단위로 무시하는 방법도 있다.
코드의 최상단에
#define _CRT_SECURE_NO_WARNINGS
를 삽입해주는 방법이다.
전처리기 설정과 마찬가지로 프로젝트 전체에 적용된다.
4. pragma warning(disable:4996)
3번과 비슷하게 소스 코드 최상단에
#pragma warning(disable:4996)
을 삽입하는 방법이다.
이 문구는 오직 4996 에러만 무시한다는 점과, 프로젝트 어디서나 선언이 가능하지만, 적용은 오직 선언된 위치부터 파일의 끝까지만 적용된다는 차이점이 있다.
당연하다면 당연할 수 있지만, 소스 코드 내에만 적용되며, 전체 프로젝트에 영향을 끼치진 않는다.
애초에 C를 코테와 과제에만 쓰다보니, 이 방법을 가장 많이 사용할 것 같다.
닫는 글
적용할 거면 전부 다 적용하고, 말 거면 말 것이지... 왜 비주얼 스튜디오에만 새 함수를 만들어서 이렇게 고생인 걸까.
포스팅하며 궁금한 부분은 chatGPT에게 많이 물어봤는데, 이런 설명은 참 잘해주는 것 같다.
비주얼 스튜디오로 코딩하는 모두, 파이팅이다.
참고 문헌
- "[C / C4996] scanf_s() 오류 발생 시 해결(무시)하는 방법", AngelPlayer, 티스토리, https://angelplayer.tistory.com/16
- "[비주얼 스튜디오] scanf 오류 왜 발생하는지, 그리고 어떻게 해결하는지", 준형 교수, 티스토리, https://programmerjoon.tistory.com/4
'알고리즘' 카테고리의 다른 글
[알고리즘] 확장 유클리드 알고리즘 구현하기 (2) | 2023.05.14 |
---|---|
[알고리즘] 유클리드 알고리즘 구현하기 (0) | 2023.05.09 |