본문 바로가기

알고리즘

[Visual Stduio] scanf_s 오류 무시하기

고칠 거면 다른 컴파일러에서도 돌아가게 하던가...

더보기

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에게 많이 물어봤는데, 이런 설명은 참 잘해주는 것 같다.

 

비주얼 스튜디오로 코딩하는 모두, 파이팅이다.


참고 문헌