C함수 정의 스타일...
글쓴이: mdh2322 / 작성시간: 수, 2009/07/15 - 10:15오전
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;
}
Forums:
오래된 K&R식
오래된 K&R식 문법이네요..
좀더 상세한 정보를
좀더 상세한 정보를 참고할만한 곳이 없나요??
ruby 코드들도 이렇게 작성된 부분이 꽤 되서, 궁금하네요. :)
----
웹페이지 : http://bzpalm.net/
----
웹페이지 : http://bzpalm.net/
...
저렇게 쓰는 건 대략 20년(?) 묵은 방식인데, 인자를 넘길 때 에러 체크가 안됩니다.
21세기가 시작된 이후 코드를 저렇게 짜는 인간이 있다면...... 조낸 맞아야 합니다.
그렇군요.. Yukihiro
그렇군요..
Yukihiro Matsumoto - ruby 창시자 - 의 코드네요. :)
ruby (1.8.6) 버전의 소스코드중 gc.c 코드 대부분이 그렇습니다.
답변 감사합니다.
----
웹페이지 : http://bzpalm.net/
----
웹페이지 : http://bzpalm.net/
created at: Tue Oct 5
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
별루...
별루...
declaration만
declaration만 "21세기식"으로 하면 에러 체크에 아무 문제 없습니다.
전 20세기부터 계속해서 저렇게 짜왔습니다.
===========================================================================
오늘 우리는 동지를 땅에 묻었습니다. 그러나 땅은 이제 우리들의 것입니다.
아직도 우리의 적은 강합니다. 그러나 우리는 그들보다 많습니다.
항상 많을 것입니다.
오늘 우리는 동지를 땅에 묻었습니다. 그러나 땅은 이제 우리들의 것입니다.
아직도 우리의 적은 강합니다. 그러나 우리는 그들보다 많습니다.
항상 많을 것입니다.
gcc 로
gcc 로 해봤는데요,
컴파일때 경고는
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
제 글에 prototype 선언
제 글에 prototype 선언 때 형을 적지 않는다는 얘기가 있었나요.
declaration을
extern void func(float a);
로 하면 type checking을 한다는 얘기였습니다.
========================================================================
오늘 우리는 동지를 땅에 묻었습니다. 그러나 땅은 이제 우리들의 것입니다.
아직도 우리의 적은 강합니다. 그러나 우리는 그들보다 많습니다.
항상 많을 것입니다.
오늘 우리는 동지를 땅에 묻었습니다. 그러나 땅은 이제 우리들의 것입니다.
아직도 우리의 적은 강합니다. 그러나 우리는 그들보다 많습니다.
항상 많을 것입니다.
제가 실험을 너무
제가 실험을 너무 단순하게 한 것 같은데... 집이라서 재실험이 좀 어렵네요.
extern void func(float a);
는 type check 는 되지만 컴파일 된 프로그램은 오동작한다고 길게 적었습니다.
애초에 traditional 엔 prototype 을 적어준다는 개념자체도 없더군요.
gcc 가 정말로 진지하게 traditional 문법을 지원하는 것 같았습니다.
float 을 요구하는 traditional func() 에겐 double 을 넘겨야만 했습니다.
넘겨주는 쪽에서는 func() 가 float 을 요구한다는 사실을 몰라야합니다.
그래서 prototype 을 적어줄 수 없고, 그러므로 type check 가 불가능하다 결론내렸었습니다.
아래 댓글에 링크해주신 옛날 글의 댓글들에서도 이런것들을 지적하고 있는 것 같은데,
속시원하게 이해가 되지는 않네요. 이해가 되면 다시 실험해보고 댓글달겠습니다.
이 좋은 날에 냄새나는 문법 얘기로 보시는 분들 눈아프게 해서...
OTL
네 저도 그다지
네 저도 그다지 건설적인 주제 같지 않아서 좀 그렇긴 합니다만 시작되버린 얘기니 말씀을 드리면
실험하신 예에서 문제가 되는 케이스는 traditional c와 iso c방법을 섞어 써서 그렇지 싶습니다.
traditional로 하실 꺼면 f();로 iso로 하실 꺼면 f(float);로 declaration을 하셔야 될 것 같군요.
그리고 iso로 하실 꺼면 func.c에도 function f에 대한 declaration을 해주셔야 합니다.
header 파일에 있는 prototype을 참고하는 iso 방식을 쓰는 거구요.
function의 definition에서 prototype을 제공하는 방식을 쓰지 않는 겁니다.
==========================================================================
오늘 우리는 동지를 땅에 묻었습니다. 그러나 땅은 이제 우리들의 것입니다.
아직도 우리의 적은 강합니다. 그러나 우리는 그들보다 많습니다.
항상 많을 것입니다.
오늘 우리는 동지를 땅에 묻었습니다. 그러나 땅은 이제 우리들의 것입니다.
아직도 우리의 적은 강합니다. 그러나 우리는 그들보다 많습니다.
항상 많을 것입니다.
예전 글 중에 관련된
예전 글 중에 관련된 게 있습니다.
http://kldp.org/node/34511
=======================================================================
오늘 우리는 동지를 땅에 묻었습니다. 그러나 땅은 이제 우리들의 것입니다.
아직도 우리의 적은 강합니다. 그러나 우리는 그들보다 많습니다.
항상 많을 것입니다.
오늘 우리는 동지를 땅에 묻었습니다. 그러나 땅은 이제 우리들의 것입니다.
아직도 우리의 적은 강합니다. 그러나 우리는 그들보다 많습니다.
항상 많을 것입니다.
요즘에도 그런지
요즘에도 그런지 모르겠는데 전에 FreeBSD 코드 보면 저렇게 되어 있더군요.
댓글 달기