warning 이 났는데.. 도데체 없어지지를 않네요
글쓴이: hany93 / 작성시간: 월, 2004/02/16 - 5:44오후
32비트 HP 장비에서 잘 쓰던 소스를 64비트 머신으로 가져와서 옵션주고 라이브러리로 컴파일 하고 있는중인데요
cc: "profile.c", line 49: warning 724: Cast converts default int return type to pointer.
이런 워닝이 나는데.. 49줄에 써 있는 내용이 먼가하면
상략 char t_buf[__BUF_LEN], *t_ptr; char *lasts; 중략 if ((t_ptr = (char *)strtok_r(t_buf, __DELIMITER, &lasts)) != NULL) 하략
입니다. man 페이지에서 제시한 string.h 헤더를 인크루드 했는데도 위의 워닝이 없어지지 않을뿐 아니라.. 워닝이 난 상태의 라이브러리를 그냥 쓰니깐. 위의 줄에서 죽어버리는군요 (메모리 폴트로요) 문법상의 오류 같지는 않은데..
혹시 이런 경우를 해결해 보신 회원님 계신가요?
컴파일 옵션은
CFLAGS = -O -c $(INCLUDE) -Aa -D_HPUX_SOURCE +DA2.0W +DS2.0 +e
를 사용하였습니다. 장비는 HP 머신이구요
Forums:
strtok_r 함수가 변형된것 같습니다. 아마도 위치 값을 리턴하는
strtok_r 함수가 변형된것 같습니다.
아마도 위치 값을 리턴하는 것 같네요..
아래와 같이 사용하여 보세요.. -.-;;
지금 HP 쪽에 로그인을 못해서 확인이 힘들지만,,컴파일하실 때
지금 HP 쪽에 로그인을 못해서 확인이 힘들지만,,
컴파일하실 때 -D_REENTRANT 나 -D_HPUX_SOURCE,
-D_POSIX_C_SOURCE=199506L, -D_XOPEN_SOURCE
같은 것을 주셔서 다시 해 보세요.
/usr/include/string.h 를 열어서 strtok_r 부분을 살펴보시면
#if defined(..) ...
#endif
로 MT 환경에서만 컴파일되도록 막혀있을 수도 있습니다.
(플랫폼에 따라서 틀립니다.)
워닝 메시지도 아마 함수 프로토타입이 알려지지 않은상태에서
기본으로 int 를 리턴값으로 생각했는데, 이를 char * 로 casting
하니까 발생한 것으로 보입니다.
옵션으로 해결되긴 했는데요 왜 샘플프로그램에서는 그냥 통과
데이터마인드 님과 최종호 님의 조언 감사합니다.
일단 소스를 안고치고 -D_REENTERANT 옵션으로 컴파일이 되긴 했는데요
strtok_r 을 사용한 아래의 샘플 프로그램에서는 64비트 옵션으로 컴파일 했을때에도 무사히 컴파일 됬는데.. 만약에 옵션에서 그랬다면 샘플프로그램에서도 컴파일이 안되고 워닝이 났어야 할 것 같은데요...
위의 코드는 _REENTERANT 옵션 없이도 아무 문제 없이 컴파일 됬거든요
어떤 차이가 있을까요? 사용한 것은 똑같은데.. 워닝이 났던것은 여러개의 함수가 묶인 것 뿐이고.. strtok_r 썼던부분은 어차피 위의 예제와 같이 딱 한군데였는데.. 음.. 뭘까요???
Re: printf() 의 경우에는...
printf() 의 경우에는 가변 인자 리스트를 사용하는 함수죠.
최근의 gcc 의 경우에는 printf() 의 경우에는 format 스트링과
뒤에 따라오는 아규먼트들의 타입을 체크해 주지만,
예전의 컴파일러들은 그런 기능이 없었죠.
실제로 printf() 의 함수 prototype 을 보시면 알겠지만,
(char *fmt, ...) 으로 되어 있어서
일반적으로는 Type-checking 이 되질 않죠.
댓글 달기