2009년 11월 6일 금요일

wsprintf()

sprintf()와 wsprintf()처럼
앞에 w가 붙은 함수는 윈도우API 함수들이라고 생각하시면
됩니다, 즉 Window Api함수라는 접두어죠.

sprintf()같은 함수는 C Rumtime 함수 입니다.
C 컴파일러 차원에서 구현되었다고 보시면되죠.
그래서, 더 저차원적인것은 w-붙은것들이 저차원이죠
윈도우커널정도라고생각하시면되고, C library야
컴파일러 다른것쓰면 함수사용법은 거의 같겠지만
내부 함수 자체구현은 다르겠죠.

w함수를 쓰는 잇점이라면,
C library가 로드되지 않느다는것과, 실행파일 사이즈가
좀 줄겠구요. 대신 소스의 컴파일러마다의 호환성등이
떨어지겠네요.

그리고 위의 소스에서 잘못된거라면,
sprintf(strTimer, "현재 초 %d",timer.GetTime());

sprintf(strTimer, "현재 초 %ld",timer.GetTime());
처럼 해주세요. %d는 정수값 범위이고, 그것으로는 담기에는
불충분하니, long형 사이즈까지 출력되도록 해야겠죠

 

============================================================

http://www.devpia.com/Forum/BoardView.aspx?no=39589&page=1&Tpage=1443&forumname=vc_free

 

그냥 똑같다.. 하고 쓰다가 얼마전 엄청난 차이를 발견했습니다-_-;;

 

혹시 아시는 분 있으신가요..

 

wsprintf 는 실수 표현이 안된다는것을 -_-..

 

============================================================

먼저... 기본적으로 sprintf() 가 Win16 기반 함수라고 착각하고 계시는데요...

 

저도 처음엔 그런줄 알았지만... 아닙니다..

 

sprintf() 함수 역시 Win95 이후부터 Win32 API에서 개정판(?)으로 당당히 Win32 API 계열에 끼는 영광을 얻었답니다.

 

즉, sprintf() 함수를 호출하면 흔히들 C런타임 라이브러리를 같이 로드 하기 때문에 오버헤드가 크다 라고 알고 계시겠지만,

 

사실은 win95 이후로 그 문제는 해결 되었다는 거죠.

 

그 증거로, <windows.h> 파일만 인크루드 해도 sprintf() 함수가 사용 가능하죠?

 

 

하지만, strcpy(), strcmp()등등의 문자열 함수들이랑 대부분의 함수들은 아직도

 

C런타임 라이브러리를 같이 로드한다고 하네요.

 

 

sprintf()와 wsprintf() 함수의 가장 큰 차이는...

 

sprintf()는 char 기반이고, wsprintf() 함수는 wchar_t 기반의 함수인데요.

 

강제로 wsprintfA()를 호출해서 char 기반 함수로 만들 수도 있습니다만...

 

sprintf()와 wsprintA() 함수는 근본적으로 다르고, wsprintfA() 함수는 sprintf()처럼 반 어셈블로 만들어진게 아니고,

 

전부 Platform SDK API를 이용해서 만들어진 함수이고(물론 랩핑이지만...), 무엇보다도, 오리지널 char 기반이 아닌,

 

wchar_t 기반 프로그래밍으로 가다가 마지막에 형변환 해주는 형태라고 들었어요....

 

그래서 어떠한 경우에도 Win32API가 wsprintfA()를 호출하지 않도록 하는 매크로도 있었는데... 까먹었구요.

 

아마도 MS 쪽에선 유니코드가 대세가 될꺼라고 생각하구 만든게 아닐까요....

 

 

아무튼 wsprintf() 함수는 정확히 말하면, Platform SDK에서 제공하는 문자열 처리 함수죠.

 

또한, sprintf()보다 wsprintf()가 훨씬 가볍다고 하네요.

 

윈도우즈 환경에 최적화된 함수라서 w를 붙였다고 하는데...

 

단지 wsprintf()를 쓰면 뭐... 호환성 쪽에서라면 문제가 될수도 있겠네요.

 

근데... 저도 왜 wsprintf()에서 왜 float형을 지원안하는지는 잘 모르겠네요.

 

 

잘 알지도 못한 제가 주절 주절 떠들어댄것 같네요...

 

어쨋든 결론은....

 

sprintf()는 그냥 CRT 함수를 윈도우 용으로 컨버팅 한거고... wsprintf()는 Platform SDK에서 지원하는 함수라는거죠....

댓글 없음:

댓글 쓰기