윈도우에서 네트워크 프로그램 소스를 컴파일 하던 중 이상한 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 에 관한 내용을 찾아 보았다.

 다음과 같은 내용을 찾을 수 있었다.



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.

 관련 링크 : http://msdn2.microsoft.com/en-us/library/aa733937(VS.60).aspx

 내용인즉 인자의 사이즈가 맞지 않는다는 것이다.

 다시 소스를 살펴보다가 다음을 발견하였다.


unsigned short__cdecl htons(unsigned short)
 즉 인자값으로 short 형이 와야 하는 것이다. 하지만 atoi() 함수는 리턴형이 int 값이므로 여기서 형변환의 문제가 생긴 것이다.

 다음과 같이 고쳐주니 warning 이 사라지고 깔끔한 컴파일이 되었다.


servAddr.sin_port = htons((unsigned short)atoi(argv[2]));

Tags: , , , , ,

2 Comments on 윈도우 네트워크 프로그래밍 중 발생한 warning C4761

  1. 리키 says:

    htons 인자가 unsigned short형 이여야 되는군요..ㅎ
    VS2008에선 Warning이 안뜨던데 VS6에선 Warning이 뜨네요..

    덕분에 깔끔하게 해결됐습니다. ㅎㅎ 🙂

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.