윈도우에서 네트워크 프로그램 소스를 컴파일 하던 중 이상한 warning 을 발견하였다.
C:Documents and SettingsOwnerMy DocumentsNetworkhelloworld_client_winhelloworld_client_win.c(34) : warning C4761: integral size mismatch in argument; conversion supplied
문제의 소스 부분은 다음이었다.
servAddr.sin_port = htons(atoi(argv[2]));
보기에는 문제가 없는 부분이다. 정상작동하는 소스였다.(..리눅스에서 확인)
물론 warning 을 무시하고 링크를 하여도 문제없이 프로그램을 잘 실행되었다.
그렇다면 무엇이 문제일까….먼저 C4761 에 관한 내용을 찾아 보았다.
다음과 같은 내용을 찾을 수 있었다.
관련 링크 : http://msdn2.microsoft.com/en-us/library/aa733937(VS.60).aspx
Compiler Warning (level 1) C4761
integral size mismatch in argument : conversion supplied
The base types of the actual and formal parameters of a function were different.
The compiler converted the actual parameter to the type of the formal parameter.
내용인즉 인자의 사이즈가 맞지 않는다는 것이다.
다시 소스를 살펴보다가 다음을 발견하였다.
unsigned short__cdecl htons(unsigned short)
즉 인자값으로 short 형이 와야 하는 것이다. 하지만 atoi() 함수는 리턴형이 int 값이므로 여기서 형변환의 문제가 생긴 것이다.
다음과 같이 고쳐주니 warning 이 사라지고 깔끔한 컴파일이 되었다.
servAddr.sin_port = htons((unsigned short)atoi(argv[2]));
htons 인자가 unsigned short형 이여야 되는군요..ㅎ
VS2008에선 Warning이 안뜨던데 VS6에선 Warning이 뜨네요..
덕분에 깔끔하게 해결됐습니다. ㅎㅎ 🙂
제 포스팅이 도움이 되었다니 기쁩니다. : )
앞으로도 종종 들려 주세요.~~