#ifdef DEBUG 사용하는데 있어서요...
글쓴이: 은영신랑 / 작성시간: 금, 2003/02/07 - 5:19오후
대략 다음과 같이 coding 하였습니다.
#ifdef DEBUG
#define DPRINTF(x) fprintf(stderr, "%d : "x, __LINE__)
#else
#define DPRINTF(x)
#endif
int main()
{
int a;
...
DPRINTF(" a : %d\", a);
..
}
제 목적은 디버그모드로 컴파일 하면 Line Number : a : ?
이런식으로 하려는데요,
위 소스를 컴파일하면 DPRINTF passed 2 arguments, but takes just 1
이라는 에러가 나오네요..
도움좀 부탁합니다.
Forums:
gcc -E xxx.c 해보세요
-E 는 preprocess한 다음 멈춥니다.
define이 실제 어떻게 변경되는지 알수 있지요
Re: #ifdef DEBUG 사용하는데 있어서요...
원하시는 대로 하려면 이게 아닐가 싶은데요....
제가 #define문의 정확한 규칙을 아는 건 아니지만....
리눅스 커널소스에서 부린 꽁수를 참고했습니다....
http://lxr.linux.no/source/include/linux/sunrpc/debug.h
Consider the ravens: for they neither sow nor reap; which neither have storehouse nor barn; and God feedeth them: how much more are ye better than the fowls?
Luke 12:24
gcc에서는 매크로도 varg를 사용할 수 있군요...
msvc++에서는 매크로에서는 varg를 사용할 수가 없어서
저는 주로 함수명을 사용한 트릭(?)을 사용합니다.
dummy_printf는 아무짓도 안하고 그냥 리턴하는 함수가 되겠구요,
debug_printf는 뭐 적당히 필요한 짓 하게 되겠죠. 그럴바에야 그냥
debug_printf를 수정하지... 하시는 분도 있지만 저런 경우가 종종
필요하니까요. 그리고 dummy_printf 같은 넘은 인라인으로 처리해서
함수 호출에 따른 오버헤드는 제거될 수도 있는 문제구요...
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
재미없는 일은 하지 않겠다는 인간 쓰레기. ㅡ,.ㅡ;;
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
위코드에서는 이한줄만 바꾸면 되지 않을까하는... #define
위코드에서는 이한줄만 바꾸면 되지 않을까하는...
#define DPRINTF(x,y) fprintf(stderr, "%d : "x,y, __LINE__)
간단히 예제를 만들어 보았습니다. (debugmsg)
아래 코드를 보시면 알겠지만 쓰는 법은 어렵지 않습니다.
(그리고 아직 test는 안해봤지만, VC++에서도 돌아갈 겁니다.)
또한 표준 C (ISO C)에 어긋나지도 않습니다.
일단, <assert.h>와 일관성을 유지하기 위해서, NDEBUG란 매크로를 씁니다. 즉, 여러분의 소스 코드에서 #include "debugmsg.h"를 하기 전에 NDEBUG란 매크로를 정의하면 DEBUG_MSG는 아무런 일도 하지 않습니다.
그리고 DEBUG_MSG는 printf와 정확히 같은 일을 하며, 대신 호출한 파일 이름과 줄 번호를 먼저 출력합니다. 그리고 디폴트로 메시지는 stderr로 나가며, 이것을 고치고 싶으면, 다른 스트림을 debug_stream_에 대입하면 됩니다.
NDEBUG를 정의하면 DEBUG_MSG를 쓰는 overhead는 단지 FILE *타입의 전역 변수 debug_stream_이 있다는 것 뿐입니다. 그럼 이만.
아래는 debugmsg.h입니다.
아래는 debugmsg.c입니다.
C FAQ: http://www.eskimo.com/~scs/C-faq/top.html
Korean Ver: http://cinsk.github.io/cfaqs/
[샘] ANSI C
이렇게 정의하고
이렇게 쓰시면 됩니다.
디버그 기능을 끄려면 컴파일러 옵션에 -DNDEBUG 을 추가하면
됩니다.
_____________________________
언제나 맑고픈 샘이가...
http://purewell.biz
[code:1]#ifdef DEBUG#define DMSG(
이런식으로 하시면 되지 않을까요? DEBUG_MESSAGE_FILE에 따라서 stdout이나 stderr또는 일반 파일에 쓰실 수 있고요.
디베그 레벨에 따라 나오는 메시지를 다르게 하려고 디버그 마스크까지 쓰시면 이런식으로 하시면 될 것 같습니다만...(요는 msgs뒤에 ...을 붙이면 되에 인자까지 되니까 printf처럼 쓰실 수 있잖아요 :-) )
rommance.net
다들 이런 분야에 관심이 많으시군요. :D 예 저도 좀 찾아봤는
다들 이런 분야에 관심이 많으시군요. :D
예 저도 좀 찾아봤는데.
#define eprintf(args...) fprintf (stderr, args)
와 같은 방식은, GNU CPP와 같은 c preprocessor가 제공하는 확장 기능이라고 하군요. 즉 표준 C가 아니라는 것이죠.
표준은, "args..."가 아닌 "..."을 단독으로 쓰고, __VA_ARGS__를 쓰는 것이라는 데, 아직 쓸 만한게 아니라고 합니다. 예를 들어,
#define eprintf(format, ...) fprintf (stderr, format, __VA_ARGS__)
와 같이 했을때, format을 제외하고 아무런 메시지를 전달하지 않을 때, __VA_ARGS__ 바로 앞의 ","가 문제가 되기 때문입니다.
이것을 ISO C에서는 variadic macro라고 하는데, GNU CPP info 문서에 따르면, 표준 자체가 좀 애매하다고 하는군요.
흠.. 제 생각에는 개인 취향이라 할까요? 완벽히 동작하는 가변 인자 매크로를 원하면, 컴파일러가 제공하는 확장 기능을 사용하는 "args..." 형식을 쓰는 것이 좋을 것이고, 불안하더라도 표준에 충실하고 싶으면 "..."와 __VA_ARGS__를 쓰는 것이 좋겠죠.
C FAQ: http://www.eskimo.com/~scs/C-faq/top.html
Korean Ver: http://cinsk.github.io/cfaqs/
##을 붙이면 됩니다.
#define eprintf(format, ...) fprintf (stderr, format, __VA_ARGS__)
을
#define eprintf(format, ...) fprintf (stderr, format, ##__VA_ARGS__)
과 같이 하면 불필요한 앞의 쉼표를 삭제합니다.
Prepending ## to __VA_ARGS__ is also a GCC extension.
Here's another trick:
#define BAR_HELPER(fmt, ...) printf(fmt "\n", __VA_ARGS__)
#define BAR(...) BAR_HELPER(__VA_ARGS__, 0)
, referring to http://stackoverflow.com/questions/5588855/standard-alternative-to-gccs-va-args-trick
[샘] VC6에서 __VA_ARGS__ 안 되는 듯...
ㅡ_-);;;
GCC에서 저 구문이 제대로 돌아가는데
VC6SP5에서는 오류가 나는군요.
ㅡ_-)/ 누가 BCC 5.5 Free Compiler로 테스트 좀 해주세요~
Always wish be pure well...
_____________________________
언제나 맑고픈 샘이가...
http://purewell.biz
VC++ 6.0 에서
VC++ 6.0 에서는 __VA_ARGS__ 가 어떤 헤더파일에서도 정의되지 않은것 같더군요.
VC++ 7.0 은 어떤가요?
Define Function을 이렇게 하면 되겠습니다...
#include <stdio.h>
/* :lol:
Define Function만들때 '\' 뒤에 공백이나 tab키가 들어가면 컴파일에러 발생합니다
*/
#include <stdio.h>
#define DPRINTF( __FORMAT__, __ARGS__ ) \
do \
{\
printf( "[Line :%d] ", __LINE__);\
printf(__FORMAT__, __ARGS__);\
printf("\n");\
}while(0)
void main()
{
int ab =1;
DPRINTF( " a : %d \n", ab );
//printf(" a : %s \n", ab);
}
=> 실행결과
[Line : 50] a : 1
Re: VC++ 6.0 에서
http://groups.google.co.kr/groups?hl=ko&lr=&ie=UTF-8&oe=UTF-8&newwindow=1&threadm=eTXXYF8uCHA.848%40TK2MSFTNGP11&rnum=3&prev=/groups%3Fhl%3Dko%26lr%3D%26ie%3DUTF-8%26oe%3DUTF-8%26newwindow%3D1%26q%3D__VA_ARGS__%2Bvc
에 보시면 알겠지만요.
라네요..
FAQ 10.26 에 있는 내용입니다.VC++ 에서 쓸 수 있는.
FAQ 10.26 에 있는 내용입니다.
VC++ 에서 쓸 수 있는...
댓글 달기