stdlib.h를 인쿨루드 하지 않고서 어떻게 exit함수를 호출 할수가 있는것이죠?

gurumong의 이미지

//file a.c
//#include ◁stdlib.h▷

int main(void)
{
exit(0);
}

어떤 책에서 exit함수가 사용된것을 보고 찾아보았는데
stdlib.h에 정의되어있는 함수였습니다
그런데 이 헤더 파일을 인쿨루드 시키지 않고 어떻게 사용이 가능한것이죠?
위처럼 아무것도 인쿨루드 시키지 않은 상태로도 사용이 가능하더라구요

컴파일할때 표준을 지키도록 gcc -ansi -pedantic a.c 해주었거든요

ktd2004의 이미지

경고 옵션을 활성화시키면 어떨까요?

-Wall -W
dong1036의 이미지

인라인 어셈블리 이용해서 직접 시스템 콜 함수를 작성하면.. 굳이 헤더파일은 필요 없다고 생각이 들지만은...;;

#define __NR_exit 2

int exit() {

long __res;
__asm__ volatile (
"int $0x80"
: "=a" (__res)
: "a" (__NR_exit)
: "memory"
);

return (int)__res;

}

테스트는 안 해봤지만.. 아마 이런형식으로 하면 굳이 헤더파일 필요 없을지도;;

뭐 이런 질문이 아니였으면 홍홍홍;;;

음 냐냐~

SoulreaveR의 이미지

컴파일러는 함수에 대한 참조를 해결하지 않습니다. 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'

cppig1995의 이미지

암묵적으로 int exit(void);으로 간주됩니다.

Real programmers /* don't */ comment their code.
If it was hard to write, it should be /* hard to */ read.

Scarecrow의 이미지

int exit()로 간주할 겁니다.

C++에서는 int exit()가 int exit(void)와 동일한 의미의 선언이지만...
C에서는 다릅니다.

neogeo의 이미지

정확한 정보라고 생각합니다.

거기에 추가로 덧붙이고 싶은 이야기는 C++ 에서는 선언되지 않은 함수는 아예 묵시적으로 int ...() 형태로 가정하지도 않습니다.
( 따라서 컴파일 error 가 발생해야 정상입니다. link 단계 error 가 아니구요. )

C compiler에서만 그런 추측을 하는 것으로 알고 있습니다.

Neogeo - Future is Now.

Neogeo - Future is Now.

cppig1995의 이미지

제가 잠시 착각했었습니다. 죄송합니다.

Real programmers /* don't */ comment their code.
If it was hard to write, it should be /* hard to */ read.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <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].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <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].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <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].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <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].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.