#define _CRT_SECURE_NO_WARNINGS 사용하는 이유
2022. 1. 2. 07:43ㆍC언어 문서화

++ 부동 소수점 상수에 대한 제한 x
DBL_EPSILON 값 : 2.2204460492503131e-016
#include <float.h> // DBL_EPSILON macro
int main()
{
float a, b;
printf("a=");
scanf("%f", &a);
printf("b=");
scanf("%f", &b);
printf("DBL_EPSILON = %.301f\n", DBL_EPSILON);
if (fabs(a - b) < DBL_EPSILON)
{
printf("same number\n");
}
else
{
printf("different number.\n");
}
return 0;
}
이 오류는 함수 scanf의 반환값을 어딘가에 대입하지 않거나 사용하지 않아서 발생하는 경고다. 코드 상 문제도 없으며 단순히 버려지는 값이 있음을 알리는 내용이다. 해결방법은 코드 첫 줄에 #pragma warning(disable:4996)을 넣어주고 scanf를 scanf_s로 바꾸어 주는 것이다. scanf는 MS가 지정한 잘못 쓰면 안전하지 않은 일이 발생할 수도 있는 함수들 중 하나이다. 그러나 %d, %f 같은 고정폭 변수만을 받아오는 경우에는 문제가 안 되나 %c, %s 류 입력들에서 문제가 된다. 버퍼 오버플로우가 발생할 수 있는 배열 입력이기 때문이다.
이러한 입력들에 대해 버퍼 크기를 지정하기 위해 MS는 scanf_s를 쓰라고 권고한다. 하지만 scanf_s는 C++ 표준 문법이 아니므로 에러를 잘라버린다.
#define _CRT_SECURE_NO_WARNINGS
또는
#pragma warnings(disable: 4996) 를 소스코드 맨 첫줄에 넣어준다. 이렇게 하면 정상적으로 수행된다.
'C언어 문서화' 카테고리의 다른 글
백준 11718 문제) fgets 함수 (0) | 2022.06.29 |
---|---|
C언어) 1. 변수 (0) | 2022.06.27 |
C언어 주석 사용 (0) | 2022.06.27 |