[질문] 함수에 대해서....

miso의 이미지

제가 서버 프로그램을 하나 분석하고 있는데요.....
소스 중에서 궁금한 것이 있어서요.....
함수가 헤더 파일이나 C 파일 제일 위에 선언되어 있지 않는데도 함수를 호출할 할 수 있나요?
제가 지금 분석하고 있는 소스에서 그렇게 사용하고 있거든요?
이것이 어찌된 일인지...
또 이상한 것은 그 함수를 다른 C파일에서 불러 사용하고 있습니다.
linux에서는 가능한가요?
이유 좀 알려 주세요.....
제가 소스는 못 올리지만..구현되어 있는 형태대로 써 보겠습니다.

AT.c 파일에...

void ap_thread(void*)
{
어쩌구 저쩌구......
if (find_EM(....)) {
}
else
return;
}

int find_EM(......)
{
return -1;
}

LT.c 파일에서...

void lt_thread(void *)
{
if (find_EM(.....)) {
}
else
return;
}

이라고 find_EM이라는 함수를 AT.c에서 구현하고... AT.c파일에서도 사용하고 LT.c 파일에서도 사용합니다. 그런데 AT.h나 LT.h파일은 없습니다.
그리고 다른 헤더파일에서도 find_EM이라는 함수 정의는 없습니다.

이런 경우가 가능한가요?
설명 좀 해주세요.... ^^;;;

체스맨의 이미지

가능합니다. C 는 프로토타입이 없는 함수에 대해서는
리터값 : int
함수 인자 : 호출측에 의해 결정.

으로 자동 간주됩니다. 컴파일러마다 특정 옵션을 주어 보다 엄격한
warning level 을 높여주면, 문제가 있다고 나오기도 합니다.

일례로 math.h 의 sin 함수를 지금처럼 사용하면, double
리턴하는 것을 int 리턴하는 것으로 간주하게 되어
결과가 잘못되게 됩니다.

Orion Project : http://orionids.org

miso의 이미지

AT.c 파일의 find_EM함수에 인자값이 있는데요..

int find_EM(int a, int b, int *ra, int *rb)
{
어쩌구 저쩌구........
return -1;
}

이런식 이여도 된다는 말씀인가요?
이해가 잘 가질 않습니다. ㅡㅡ;;;

*^^*

체스맨의 이미지

AT.c 를 보면 find_EM 이 먼저 호출 되고 그 다음 find_EM 이 실제로
정의 돼 있습니다. 이 경우 먼저 호출되는 부분(호출측)에서 프로토타입이
일단 암묵적으로 정의 되고, 나중에 나오는 find_EM 이 그 프로토타입과
맞으면 엄격한 체크 옵션을 주지 않은 경우 컴파일러는 문제가 없다고
판단하고 넘어갑니다.

LT.c 도 마찬가지구요. 링커는 함수 프로토타입엔 개의치 않고
심볼이 resolved 되는가만 검사하니까요.

Orion Project : http://orionids.org

miso의 이미지

main 함수에서 lt_thread를 호출하고 나서 ap_thread를 호출을 하는데요....
그것도 가능한 가요?
체스맨 님의 말씀은 ap_thread를 먼저 메모리에 load하면.... find_EM이라는 함수가 메모리에 올라와 있어서.... 암묵적으로 lt_thread에서 사용할수 있다는 말씀아닌가요?
만약에 그렇다면...
main 함수에서는 lt_thread를 호출하고 나서... ap_thread를 호출하는데....
이해가 잘 안되네요.... ㅜ.ㅜ

다시 한번 설명해주시면 안될까요?

*^^*

체스맨의 이미지

처음 질문이 C 에서 프로토타입 없는 함수가 호출 될 수 있는가
하는 것이었는데, 간단히 말하면,
'됩니다.'

지금 말씀하시는 것으로 보아, 컴파일 및 링크 과정과 그 의미에 대한
이해가 약간 부족한 것이 아닌가 생각되네요. 계속 프로그래밍 일
하시고, 가능하면 어셈블리어 쪽으로도 공부를 하시면 지금 말씀하신 것들에
대한 궁금증이 풀리실 겁니다.

Orion Project : http://orionids.org

sunyzero의 이미지

xxxx.c:255: warning: implicit declaration of function `myfunc'

이 메시지는 말그대로 암묵적으로 선언된것으로 간주하는것입니다. 보통 선언해주는것이 좋지만, 선언하지 않더라도 에러는 아닙니다.

========================================
* The truth will set you free.

pynoos의 이미지

사족이지만,

C의 경우 함수명이 Object에 그대로 들어 가게 되므로,
암묵적인 선언을 사용해도 link가 제대로 됩니다.

또한, 함수의 인자가 여러개 일지라도, 인자를 넘겨주는 함수 즉, 호출하는 함수가, 함수에서 돌아오면 스택을 비우므로, 인자의 갯수를 몰라도 큰오류는 일어나지 않는 것입니다.
하지만, 암묵적인 사용이 이름이 같은 다른 함수와 링크되고, 심지어 인자의 갯수가 상당한 차이를 보이게 되면, 호출되는 함수에서 이상한 참조를 하게 되므로,
실행오류가 있을 수 있습니다. 또, 스택을 비우는 것이 녀석이 호출되는 함수에서 일어나는 환경이라면, 갯수의 차이는 심각해지겠지요.

C++ 같은 naming mangling이 일어나는 언어에서는 오브젝트에 들어가는 이름이 달라지게 되므로, 암묵적인 선언을 사용하는 것은 불가능합니다.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.