skin by SERIALOG Eolin Tattertools RSS Feed
JukeBox프로필위치로그태그구름방명록방명록
'prototype'에 해당되는 글 1건
strtok (1) | 2006/05/11
strtok
* ssanighe  |  2006/05/11 16:18  |  콤퓨타
2006/05/11 16:18 2006/05/11 16:18
#include <stdio.h>
#include <string.h>

int main()
{
  ...
  pStr = strtok(sData, "=");
  ...
}
compiled without any warning or error.

#include <stdio.h>
//#include <string.h>

int main()
{
  ...
  pStr = strtok(sData, "=");
  ...
}
warning: assignment makes pointer from integer without a cast


#include <stdio.h>
//#include <string.h>

int main()
{
  ...
  pStr = (char*)strtok(sData, "=");
  ...
}
compiled without any warning or error.

Q. pStr 변수도 "char *" 형 이고 strtok에서 되돌려주는 인자도 "char *" 형이기때문에 (즉, 같은 변수 타입에서의 대입이기때문에) 아무 문제가 없을것 같은데.. 왜 이런 경고가 뜰까요?

A. 어떠한 명칭의 선언이 보이지 않은 상태에서 함수호출 수식형태에 그 명칭이 나온다면 (명칭뒤에 괄호에 쌓인 인자 리스트), 그 수식이 있는 가장 안쪽 scope 에 다음과 같은 선언이 존재하는 것처럼 호출이 이루어집니다.

extern int 명칭();

따라서, strtok 의 선언이 존재하지 않으면, strtok 의 호출이 있을 때 아래와 같은 선언이 있는 것처럼 다루어지는 것입니다.

extern int strtok();

물론, strtok() 의 원래 정의와 이 선언 (이러한 선언을 implicit declaration 이라고 합니다) 은 호환되지 않으므로, 프로그램 실행의 행동은 기술적으로 undefined 가 됩니다. 어찌되었든, 저 선언에 의하면 strtok() 의 반환형은 int 형인데, 그 값을 캐스트 없이 포인터형인 char * 에 대입하려 하므로, 아래와 같은 경고가 (사실상 표준에 의해 요구되는 진단 - diagnostic - 입니다) 발생하는 것입니다.

경우에 따라, implicit declaration 이 유용히 쓰일 수 있을지 모르나,그러한 선언에 의존하는 행동은 그 호출이 잘 정의되는 경우라 해도 바람직하지 않습니다. 표준은 라이브러리 함수를 사용하는 여러가지 방법을 제공하고 있지만, 원칙적으로 관련된 헤더를 명시적으로 #include 해서 사용하도록 하시기 바랍니다.

Q. 프로그램에서 string.h 헤더파일을 추가해주지도 않았는데, 즉, 내 프로그램은 strtok 함수가 어디 있는지도 모르는데 어떻게 컴파일러가 strtok를 찾아서 호출해 주나요?

A. string.h 을 뒤져봐도 strtok 함수가 어디에 있는지는 적혀있지 않습니다. C 컴파일러가 기본적으로 찾는 라이브러리에 들어있을 뿐이죠.
하지만 #include <string.h> 를 해주면 strtok에대한 prototype은 정의가 되겠죠. 따라서 첫번째의 경우 warning이 발생하지 않습니다.

이올린에 북마크하기(0) 이올린에 추천하기(0)
JoinC | 2006/05/20 11:39 | PERMALINK | EDIT/DEL | REPLY
자료출처: www.joinc.co.kr/modules.php?op=modload& name=Forum&file=viewtopic&topic=24185&forum=6&7
[로그인][오픈아이디란?]
 이름   비밀번호 
 홈페이지

비밀글
Powered by Tattertools & Tistory / Designed by Senil Laires
블로그 공개사진

클릭시 확대됩니다.
카테고리
새로운 글

새로운 덧글
연결된 곳
블로그 달력

«   2008/12   »
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31      
태그구름
새로운 관련글
블로그 노트
글 보관소
블로그 정보


   오늘 방문자  |  216

   어제 방문자  |  849

   전체 방문자  |  363245