[완료] C언어에서 함수 정의하는 경우

kite7의 이미지

qmail 소스를 보니 아래와 같은 코드가 있었습니다.

void alloc_free(x)
char *x;   /* <----- 이부분입니다 */
{
  if (x >= space)
    if (x < space + SPACE)
      return; /* XXX: assuming that pointers are flat */
  free(x);
}

이 경우 인자인 X의 형이 괄호 안에 정의되어 있는 것이 아니라
따로 적어 놨더군요.
제가 경험이 별로 없어서 이런 형태의 함수 정의는 처음 봤습니다.
원래 이런 형태도 가능 한것인가요?

익명사용자의 이미지

ANSI C 표준이 나오기 이전 구석기시대에 사용하던 C입니다. 되기는 됩니다.

저렇게 쓰면 alloc_free에 인자를 뭘 넣고 부르든, 안 넣든, 열두 개를 넣든, 절대 컴파일러가 타입 체킹을 하지 않는다는 대단한 장점(???)이 있으므로, 최소한의 양심이 있는 프로그래머라면 90년대 이후로 저런 코딩은 하지 않습니다. :P

kite7의 이미지

답변 감사하구요^^"

음, 전 Qmail쫌 되면 코딩 스타일 같은 것이 뭔가 교과서 같을거 같아서 보려고 했었는데.

만드신 교수님이 좀 옛날 분이라서 그런지.. 탭사이즈도 2개고..
함수 정의도 옛날 식으로 하시는군요...

하긴 실력이 있으시니깐 타입체킹 따위는 필요 없으실지도..

갑자기 예전 knuth 교수의 "돌에 글씨를 새기듯이 프로그래밍을 한다" 는 말이 떠오르네요..
그런 분들은 .. 오류있는 코드는 무의식적으로 안만들어지겠죠...

익명사용자의 이미지

음 어감이 재밌다니 감사합니다. 저의 아방가르드한 언어감각을 이해해 주는 사람들이 많지 않은데.. -.-

> 하긴 실력이 있으시니깐 타입체킹 따위는 필요 없으실지도..
> 갑자기 예전 knuth 교수의 "돌에 글씨를 새기듯이 프로그래밍을 한다" 는 말이 떠오르네요..
> 그런 분들은 .. 오류있는 코드는 무의식적으로 안만들어지겠죠...

음, 제 생각은 좀 다릅니다. 코드는 움직이는 거죠. 네. --;

세줄짜리 코드라도 언젠가는 디버깅을 해야 하고, 디버깅/유지보수할 사람이 자기가 될 거라는 보장은 없습니다. 따라서 자신이 아무리 버그를 안 낼 자신이 있다 해도 "난 자신있어!" 하면서 컴파일러가 제공하는 타입 체킹 등의 기능을 무시하는 프로그래머는 제 생각에 아주 무책임한 프로그래머입니다. 직장 동료로 마주치고 싶지 않은 타입이죠.

나중에 그 코드를 들여다보고 고칠 사람도 생각해 줘야죠. -_-

- jick

powerson의 이미지

kite7 wrote:

하긴 실력이 있으시니깐 타입체킹 따위는 필요 없으실지도..

갑자기 예전 knuth 교수의 "돌에 글씨를 새기듯이 프로그래밍을 한다" 는 말이 떠오르네요..
그런 분들은 .. 오류있는 코드는 무의식적으로 안만들어지겠죠...

저 역시 이 말에는 동의하기 좀 힘듭니다. 100% 완전한 소프트웨어는 없다는 말이 생각이 납니다. 제 아무리 뛰어나고, 엄청난 경력을 소유하신 분들이라 하더라도, 코드를 짜면서 실수란 하기 마련입니다. 또한 다른 분이 말씀하신 것처럼 평생 그 분이 해당 코드를 관리하실게 아니라면, 아무래도 그 코드를 이어 받거나, 혹은 같이 일할 사람들을 생각해주는 센스도 필요하다고 생각됩니다. ㅎㅎ

------------------------------------------------------
아직은 젊다. 모든 것을 할 수 있는 나이란 말이지.

------------------------------------------------------
아직은 젊다. 모든 것을 할 수 있는 나이란 말이지.

Hyun의 이미지

[parkhw00@poor ~]$ cat test.c
#include <stdio.h>
 
void alloc_free(x)
        char *x;
{
        printf( "%s: %s\n", __func__, x );
}
 
int main( void )
{
        alloc_free( "abc" );
        alloc_free( "abc", "def" );
 
        return 0;
}
[parkhw00@poor ~]$ gcc test.c -Wall
[parkhw00@poor ~]$ 

흠... 정말 경고를 안내는군요...
황진호의 이미지


저도 처음에 저게 뭐지? 했는데..

옛날식 표현방법이더라구요.. 여러 파라메터를 정의하면 아래로 쭉 쓰면 되겠죠?

그냥 요즘은 넣어서 쓰는게 좋습니다.

윗분께서 말씀하신것과 같은 어의 없는 error 때문에 골치썪는것 보다는..ㅋ

수고요~

IsExist의 이미지

교육 일선에 계시는 분이 옛날 스타일로만 가르치는건 좀 이상하네요.
두가지를 다 알려주고 그중 한가지를 쓴다면 문제가 덜 될듯한데요.
일단 교수님께 문제제기를 해보는게 좋지 않을까 생각합니다.
---------
간디가 말한 우리를 파괴시키는 7가지 요소

첫째, 노동 없는 부(富)/둘째, 양심 없는 쾌락
셋째, 인격 없는 지! 식/넷째, 윤리 없는 비지니스

이익추구를 위해서라면..

다섯째, 인성(人性)없는 과학
여섯째, 희생 없는 종교/일곱째, 신념 없는 정치

---------
간디가 말한 우리를 파괴시키는 7가지 요소

첫째, 노동 없는 부(富)/둘째, 양심 없는 쾌락
셋째, 인격 없는 지! 식/넷째, 윤리 없는 비지니스

이익추구를 위해서라면..

다섯째, 인성(人性)없는 과학
여섯째, 희생 없는 종교/일곱째, 신념 없는 정치

sephiron의 이미지

질문자는 http://en.wikipedia.org/wiki/Daniel_J._Bernstein을 말씀하시는 것 같습니다.

전웅의 이미지

qmail 의 경우 함수 정의와 선언에서 모두 비원형을 사용하기 때문에
적용되지 않는 이야기지만, 함수 정의를 비원형 방식을 사용했다고 해서
함수 호출시 매개변수의 개수, type 에 대한 검사가 항상 이루어지지
않는 것은 아닙니다. 함수 호출시에 필요한 모든 검사를 수행하면서도
하위 호환성 유지를 위해 비원형 정의를 사용할 수도 있습니다. 따라서
함수 정의 형태만 놓고는 함수가 호출될 때 매개변수-인자 검사가
올바르게 수행되지 않는다고 단정할 수는 없습니다.

함수 선언을 원형으로 적절히 제공할 경우 함수의 비원형 정의-원형
선언의 호환 규칙에 의해 필요한 건 다 검사됩니다.

woong ~ # cat alloc.h alloc.c main.c
/* alloc.h */
#ifdef __STDC__
#define PARAM(x) x
#else
#define PARAM(x)
#endif
 
void alloc_free PARAM((char *x));
 
 
/* alloc.c */
#include "alloc.h"
 
void alloc_free(x)
int *x;    /* wrong! */
{
   /* ... */
}
 
 
/* main.c */
#include "alloc.h"
 
int main(void)
{
    char *p = 0;
 
    alloc_free(p);
 
    return 0;
}
 
woong ~ # gcc alloc.c main.c
alloc.c: In function 'alloc_free':
alloc.c:6: error: argument 'x' doesn't match prototype
alloc.h:8: error: prototype declaration

함수 선언의 경우 간단한 매크로로 원형/비원형 전환이 쉽지만, 함수
정의는 그렇지 않아 일단 비원형으로 정의한 후에 원형 선언과의 호환
검사를 통해 원하는 검사가 모두 이루어지도록 하기 위해 아직도 종종
비원형 함수 정의를 사용하고 있습니다. 물론, 일반적인 상황에서 이는
아주 (매우 심하게) 구식인 implementation 을 고려한 것입니다 - 물론,
비원형 선언/정의 자체가 지양되어야 하는 마당에 그런 구식
implementation 을 고려할 필요가 있는지에는 회의적입니다.

* PARAM 매크로 사용에 실수가 있어 수정했습니다.

--
Jun, Woong (woong at icu.ac.kr)
Web: http://www.woong.org (서버 공사중)

--
Jun, Woong (woong at gmail.com)
http://www.woong.org

kite7의 이미지

샘플 소스까지 보여주시고 답해주신 분들 모두 감사드립니다^^"

전웅님 책은 사놓고 아직도 1/10밖에 못봤네요. ㅋ ㅡㅡ;

댓글 달기

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