티스토리 뷰

다음과 같은 C 코드를 살펴보자.

#include <stdio.h>

int main()

{

  float f;

  scanf("%f", &f);

  return 0;

}


이 얼마나 간단명료한 코드인가! 에러가 나올 만한 부분이 전혀 없어 보인다. 하지만 Visual C++에서 이 코드를 실행시키면 어이없게도 런타임 에러가 뜬다.


Release 모드에서 실행했을 때의 모습
결론부터 말하자면, 이건 Visual C++의 버그다.
scanf나 printf에서 "%f"를 이용해 실수를 입력받는 라이브러리는 엄청 크기가 크다. 그래서 Visual C++의 컴파일러는 이 라이브러리가 불필요하다고 판단되었을 경우에 아예 라이브러리를 실행파일에 포함시키지 않는다.
문제는, 위의 코드처럼 실수를 입력받는 부분이 있더라도, 실수 변수를 한 번도 사용하지 않았다면 실수 입력이 불필요한 것으로 판단해 버린다는 것이다. 그러므로 "강제로 실수 변수를 사용하도록 만들면" 더 이상 에러가 발생하지 않게 된다. 예를 들어서 아래의 코드는 정상적으로 실행된다.

#include <stdio.h>

int main()

{

  float f = 1;

  scanf("%f", &f);

  return 0;

}

물론 Visual C++의 컴파일러가 아닌 다른 C/C++ 컴파일러를 사용해도 에러가 발생하지 않는다.

'기억하자정보 > 기타' 카테고리의 다른 글

윈도우 API 예제  (0) 2006.10.02
IEEE 754 소스  (0) 2006.09.26
자료형과 2에 대한 보수(2's complement)  (0) 2006.09.25
IEEE 754 - 부동소수점 표기법  (0) 2006.09.25
데이터형에 따른 메모리 구조와 연산  (0) 2006.09.25
댓글
안내
궁금한 점을 댓글로 남겨주시면 답변해 드립니다.