C함수 정의 스타일...

mdh2322의 이미지

MD5관련 소스를 보다가 아래와 같은 스타일로 함수가 정의 되있네요.
아무래도 인자마다 주석달기가 편해보이네요..
새로 제정이 된걸까요? 신기하네요.ㅎㅎㅎ

static void MD5_memset (output, value, len)
POINTER output;
int value;
unsigned int len;
{
unsigned int i;

for (i = 0; i < len; i++)
((char *)output)[i] = (char)value;
}

lazycoder의 이미지

오래된 K&R식 문법이네요..

평양선봉의 이미지

좀더 상세한 정보를 참고할만한 곳이 없나요??

ruby 코드들도 이렇게 작성된 부분이 꽤 되서, 궁금하네요. :)
----
웹페이지 : http://bzpalm.net/

----
웹페이지 : http://bzpalm.net/

jick의 이미지

저렇게 쓰는 건 대략 20년(?) 묵은 방식인데, 인자를 넘길 때 에러 체크가 안됩니다.

21세기가 시작된 이후 코드를 저렇게 짜는 인간이 있다면...... 조낸 맞아야 합니다.

평양선봉의 이미지

그렇군요..

Yukihiro Matsumoto - ruby 창시자 - 의 코드네요. :)
ruby (1.8.6) 버전의 소스코드중 gc.c 코드 대부분이 그렇습니다.

답변 감사합니다.
----
웹페이지 : http://bzpalm.net/

----
웹페이지 : http://bzpalm.net/

bushi의 이미지

created at: Tue Oct 5 09:44:46 JST 1993
( http://www.ruby-doc.org/doxygen/1.8.4/gc_8c-source.html )
20세기 물건이므로 패스.

스타일 자체는 흔히 볼 수 있습니다.
탄생한지 좀 오래된 유틸리티들 소스를 보면 스타일이 유지된 체로 보수되는 것을 보실 수 있고요.
언젠가 tail(이던가...?)의 소스가 궁금해서 들여다보고 그 년식에 감탄했었습니다.

OTL

redstar08302009의 이미지

별루...

crimsoncream의 이미지

declaration만 "21세기식"으로 하면 에러 체크에 아무 문제 없습니다.
전 20세기부터 계속해서 저렇게 짜왔습니다.
===========================================================================
오늘 우리는 동지를 땅에 묻었습니다. 그러나 땅은 이제 우리들의 것입니다.
아직도 우리의 적은 강합니다. 그러나 우리는 그들보다 많습니다.
항상 많을 것입니다.

오늘 우리는 동지를 땅에 묻었습니다. 그러나 땅은 이제 우리들의 것입니다.
아직도 우리의 적은 강합니다. 그러나 우리는 그들보다 많습니다.
항상 많을 것입니다.

bushi의 이미지

gcc 로 해봤는데요,

void
func(a)
float a;
{
  printf("%f\n", a);
}
라는 함수가 func.c 에 있다면

#if 1
extern void func(a);
#else
extern void func(float a);
#endif
 
int main()
{
   float a = 3.14;
   func(a);
}
라고 main.c 를 작성해야만 되더군요.
컴파일때 경고는
warning: parameter names (without types) in function declaration
(traditional 로 속일 수 있는 옵션이 없어서 다른 시도는 못해봤습니다. -traditional 옵션은 preprocessing 때나 적용가능하더군요.)

void func(float a); 라 선언해주면 넘기기 전에 float 으로 (크기가) 고정되어 버리고,
func() 는 이걸 double->float 으로 형변환시도하다 망가지는 것 같았습니다.
엉뚱한 숫자를 찍습니다.
컴파일 때 -Wtraditional 로 볼 수 있는 경고문은,
passing argument 1 of ‘func’ as ‘float’ rather than ‘double’ due to prototype
(이것만 보면, traditional 에서는 float 을 파라미터로 쓰면 안되는 것 처럼 보입니다.)

prototype 선언 때 형을 적지 않으신다면,
헤더파일에 있는 prototype을 참고하는... 이런 방식의 코딩을 하지 않는다는 말씀이신가요 ?
prototype 에 형이 명시되어 있지 않는 상태에서 컴파일 타임에 에러를 잡아낼 수 있다는 말인가요 ?
(... 사용하시는 컴파일러가 ISO C 스타일 문법을 지원하지 않는 것은 아니죠 ?)

OTL

crimsoncream의 이미지

제 글에 prototype 선언 때 형을 적지 않는다는 얘기가 있었나요.

declaration을
extern void func(float a);
로 하면 type checking을 한다는 얘기였습니다.

========================================================================
오늘 우리는 동지를 땅에 묻었습니다. 그러나 땅은 이제 우리들의 것입니다.
아직도 우리의 적은 강합니다. 그러나 우리는 그들보다 많습니다.
항상 많을 것입니다.

오늘 우리는 동지를 땅에 묻었습니다. 그러나 땅은 이제 우리들의 것입니다.
아직도 우리의 적은 강합니다. 그러나 우리는 그들보다 많습니다.
항상 많을 것입니다.

bushi의 이미지

제가 실험을 너무 단순하게 한 것 같은데... 집이라서 재실험이 좀 어렵네요.

extern void func(float a);
는 type check 는 되지만 컴파일 된 프로그램은 오동작한다고 길게 적었습니다.
애초에 traditional 엔 prototype 을 적어준다는 개념자체도 없더군요.

gcc 가 정말로 진지하게 traditional 문법을 지원하는 것 같았습니다.
float 을 요구하는 traditional func() 에겐 double 을 넘겨야만 했습니다.
넘겨주는 쪽에서는 func() 가 float 을 요구한다는 사실을 몰라야합니다.
그래서 prototype 을 적어줄 수 없고, 그러므로 type check 가 불가능하다 결론내렸었습니다.

아래 댓글에 링크해주신 옛날 글의 댓글들에서도 이런것들을 지적하고 있는 것 같은데,
속시원하게 이해가 되지는 않네요. 이해가 되면 다시 실험해보고 댓글달겠습니다.

이 좋은 날에 냄새나는 문법 얘기로 보시는 분들 눈아프게 해서...

OTL

crimsoncream의 이미지

네 저도 그다지 건설적인 주제 같지 않아서 좀 그렇긴 합니다만 시작되버린 얘기니 말씀을 드리면
실험하신 예에서 문제가 되는 케이스는 traditional c와 iso c방법을 섞어 써서 그렇지 싶습니다.

traditional로 하실 꺼면 f();로 iso로 하실 꺼면 f(float);로 declaration을 하셔야 될 것 같군요.
그리고 iso로 하실 꺼면 func.c에도 function f에 대한 declaration을 해주셔야 합니다.

header 파일에 있는 prototype을 참고하는 iso 방식을 쓰는 거구요.
function의 definition에서 prototype을 제공하는 방식을 쓰지 않는 겁니다.

==========================================================================
오늘 우리는 동지를 땅에 묻었습니다. 그러나 땅은 이제 우리들의 것입니다.
아직도 우리의 적은 강합니다. 그러나 우리는 그들보다 많습니다.
항상 많을 것입니다.

오늘 우리는 동지를 땅에 묻었습니다. 그러나 땅은 이제 우리들의 것입니다.
아직도 우리의 적은 강합니다. 그러나 우리는 그들보다 많습니다.
항상 많을 것입니다.

crimsoncream의 이미지

예전 글 중에 관련된 게 있습니다.
http://kldp.org/node/34511
=======================================================================
오늘 우리는 동지를 땅에 묻었습니다. 그러나 땅은 이제 우리들의 것입니다.
아직도 우리의 적은 강합니다. 그러나 우리는 그들보다 많습니다.
항상 많을 것입니다.

오늘 우리는 동지를 땅에 묻었습니다. 그러나 땅은 이제 우리들의 것입니다.
아직도 우리의 적은 강합니다. 그러나 우리는 그들보다 많습니다.
항상 많을 것입니다.

asiawide의 이미지

요즘에도 그런지 모르겠는데 전에 FreeBSD 코드 보면 저렇게 되어 있더군요.

댓글 달기

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