지금까지 신경안쓰고 사용해 왔는데 갑가지 원인을 알고 싶어서 질문 드립니다.
exit()를 사용한 소스를 컴파일하면
warning: implicit declaration of function `exit'
이렇게 나옵니다만 실행은 잘되지요.
선언도 안 돼있으면서 어떻게 실행이 되는겁니까?
warning은 컴파일 시에 나온겁니다.
컴파일러가 컴파일 시에 프로그램 내에 사용된 함수가 프로토타입에 맞게 사용되었는지를 검사해야 하는데 사용된 함수의 프로토타입을 찾을 수 없으므로 그런 warning을 내는겁니다.
실행이 되는것은 컴파일 후 링크될때 링커가 libc(libc.so.6 - exit() 에 대한 코딩이 여기에 있습니다)를 링크했기 때문입니다. 링크가 되었기 때문에 실행파일이 시작될때 로더가(ld-linux.so.2)가 libc 를 로드하고 실행되게 됩니다.
우리 모두 리얼리스트가 되자. 그러나 가슴에 이룰 수 없는 꿈을 가지자
C 에서는 선언되지 않은 함수에 대한 것은 모두 int func() 로 인식합니다. 들어가는 인자의 수는 별로 중요하게 생각하지 않지요. 함수를 호출하는 녀석이 인자가 들어 있는 스택을 해제하는 환경이라면 더욱 그렇지요.
그리고, compile 할때 함수 이름에 mangling이 일어나지 않기 때문에, link 시에도 제대로 됩니다. 만일 C++이라면, 결코 가능하지 않은 시나리오입니다.
C++은 들어가는 인자에 따라 컴파일 이름이 바뀌며, link도 전혀 다른 녀석하고 되기 때문이지요. 따라서 C++은 prototype 선언이 중요하게 생각되는 것이 바로 이런 이유입니다.
---http://coolengineer.com
exit() 함수가 어떻게 생겼는지 모르니까 warning이 나오죠.
man exit 라고 하면 답이 있습니다.
EXIT(3) Linux Programmer's Manual EXIT(3) NAME exit - cause normal program termination SYNOPSIS #include <stdlib.h> void exit(int status);
stdlib.h를 불러주면 됩니다.
#include <stdlib.h>
이걸 빠뜨리신것 같은데..
설마가 사람잡을 때도 가끔씩 있죠^^; (저같은 경우는 참 많았습니다만..)
한번 확인해보세요~~
텍스트 포맷에 대한 자세한 정보
<code>
<blockcode>
<apache>
<applescript>
<autoconf>
<awk>
<bash>
<c>
<cpp>
<css>
<diff>
<drupal5>
<drupal6>
<gdb>
<html>
<html5>
<java>
<javascript>
<ldif>
<lua>
<make>
<mysql>
<perl>
<perl6>
<php>
<pgsql>
<proftpd>
<python>
<reg>
<spec>
<ruby>
<foo>
[foo]
warning은 컴파일 시에 나온겁니다.컴파일러가 컴파일 시에 프
warning은 컴파일 시에 나온겁니다.
컴파일러가 컴파일 시에 프로그램 내에 사용된 함수가 프로토타입에 맞게 사용되었는지를 검사해야 하는데 사용된 함수의 프로토타입을 찾을 수 없으므로 그런 warning을 내는겁니다.
실행이 되는것은 컴파일 후 링크될때 링커가 libc(libc.so.6 - exit() 에 대한 코딩이 여기에 있습니다)를 링크했기 때문입니다.
링크가 되었기 때문에 실행파일이 시작될때 로더가(ld-linux.so.2)가 libc 를 로드하고 실행되게 됩니다.
우리 모두 리얼리스트가 되자. 그러나 가슴에 이룰 수 없는 꿈을 가지자
C 에서는 선언되지 않은 함수에 대한 것은 모두 int func() 로
C 에서는 선언되지 않은 함수에 대한 것은 모두 int func() 로 인식합니다.
들어가는 인자의 수는 별로 중요하게 생각하지 않지요. 함수를 호출하는 녀석이 인자가 들어 있는 스택을 해제하는 환경이라면 더욱 그렇지요.
그리고, compile 할때 함수 이름에 mangling이 일어나지 않기 때문에, link 시에도 제대로 됩니다.
만일 C++이라면, 결코 가능하지 않은 시나리오입니다.
C++은 들어가는 인자에 따라 컴파일 이름이 바뀌며, link도 전혀 다른 녀석하고 되기 때문이지요. 따라서 C++은 prototype 선언이 중요하게 생각되는 것이 바로 이런 이유입니다.
---
http://coolengineer.com
exit() 함수가 어떻게 생겼는지 모르니까 warning이 나오죠.
exit() 함수가 어떻게 생겼는지 모르니까 warning이 나오죠.
man exit 라고 하면 답이 있습니다.
stdlib.h를 불러주면 됩니다.
아마도 이것은..
#include <stdlib.h>
이걸 빠뜨리신것 같은데..
설마가 사람잡을 때도 가끔씩 있죠^^;
(저같은 경우는 참 많았습니다만..)
한번 확인해보세요~~
댓글 달기