stdlib.h를 인쿨루드 하지 않고서 어떻게 exit함수를 호출 할수가 있는것이죠?
글쓴이: gurumong / 작성시간: 월, 2009/01/05 - 1:47오전
//file a.c
//#include ◁stdlib.h▷
int main(void)
{
exit(0);
}
어떤 책에서 exit함수가 사용된것을 보고 찾아보았는데
stdlib.h에 정의되어있는 함수였습니다
그런데 이 헤더 파일을 인쿨루드 시키지 않고 어떻게 사용이 가능한것이죠?
위처럼 아무것도 인쿨루드 시키지 않은 상태로도 사용이 가능하더라구요
컴파일할때 표준을 지키도록 gcc -ansi -pedantic a.c 해주었거든요
Forums:
경고 옵션을
경고 옵션을 활성화시키면 어떨까요?
어셈블리 이용하면 될 것 같은데요?
인라인 어셈블리 이용해서 직접 시스템 콜 함수를 작성하면.. 굳이 헤더파일은 필요 없다고 생각이 들지만은...;;
#define __NR_exit 2
int exit() {
long __res;
__asm__ volatile (
"int $0x80"
: "=a" (__res)
: "a" (__NR_exit)
: "memory"
);
return (int)__res;
}
테스트는 안 해봤지만.. 아마 이런형식으로 하면 굳이 헤더파일 필요 없을지도;;
뭐 이런 질문이 아니였으면 홍홍홍;;;
음 냐냐~
함수에 대한 참조는 링크 단계에서 해결합니다.
컴파일러는 함수에 대한 참조를 해결하지 않습니다. include하지 않아도, exit()라는 함수를 나중에 누군가 알려줄 것이다고 기대하고 그냥 object 파일을 만들고, 링커는 필요한 다른 라이브러리를 뒤져서 exit()함수에 대한 진입점을 알려줍니다. gcc는 별다른 옵션이 주어지지 않았을 때, 기본적인 library를 자동으로 링크 단계에 포함해 줍니다. 다음의 방식으로 exit()가 자동적으로 해결되지 않는 것을 확인할 수 있습니다.
gcc -S main.c
as main.s -o main.o
ld main.o // error : undefined reference to 'exit'
암묵적으로 int
암묵적으로 int exit(void);으로 간주됩니다.
Real programmers /* don't */ comment their code.
If it was hard to write, it should be /* hard to */ read.
int exit()로 간주할
int exit()로 간주할 겁니다.
C++에서는 int exit()가 int exit(void)와 동일한 의미의 선언이지만...
C에서는 다릅니다.
정확한 정보라고
정확한 정보라고 생각합니다.
거기에 추가로 덧붙이고 싶은 이야기는 C++ 에서는 선언되지 않은 함수는 아예 묵시적으로 int ...() 형태로 가정하지도 않습니다.
( 따라서 컴파일 error 가 발생해야 정상입니다. link 단계 error 가 아니구요. )
C compiler에서만 그런 추측을 하는 것으로 알고 있습니다.
Neogeo - Future is Now.
Neogeo - Future is Now.
제가 잠시
제가 잠시 착각했었습니다. 죄송합니다.
Real programmers /* don't */ comment their code.
If it was hard to write, it should be /* hard to */ read.
댓글 달기