[C언어] func(args...)에 관하여.

sound79의 이미지

#include <stdio.h>
#include <stdarg.h>
#include <stdlib.h>

#define PRINTK(args...) print(args)
void print(char *args, ...){
        va_list vlist;
        va_start(vlist, args);
        vfprintf(stdout, args, vlist);
        va_end(vlist);
}
int main()
{
        PRINTK("%d\n", 123);
        return 0;
}

여기서 PRINTK(args...) <== 이부분을 잘 모르겠네요.
gcc에서는 컴파일이 되나 다른 컴파일러에서는 에러가 발생합니다.

부트로더를 작성중인데 다른 부트로더를 참조하니
#define PRINTK(args...) print(args)
이런 구문이 보여서요.. 테스트로 gcc로 컴파일을 하니깐 잘 됩니다.
하지만 다른 Visual C에서는 오류가 뜨네요.
error C2010: '.' : unexpected in macro formal parameter list
그리고 현재는 ADS1.2를 사용하고 있습니다. 그런데 이렇게 하니 too few arguments to macro ~~라고 뜨네요.
혹시 ANSI에 맞지 않는 구문인지요?

lovewar의 이미지

GNU CPP에서 지원하는 named variadic macro라고 합니다.

C99에서는 anonymous variadic macro를 사용합니다.

	#define PRINTK(...) fprintf(stderr, __VA_ARGS__) /* c99 */
	#define PRINTK(args...) fprintf(stderr, args)	/* GNU CPP */

-- 덧붙이는 글 --
http://www.redhat.com/docs/manuals/enterprise/RHEL-4-Manual/cpp/variadic-macros.html

dasomoli의 이미지

ADS 1.2 시라면 lovewar님이 쓰신 C99 형식으로 쓰시면 됩니다.

저도 ADS 1.2 에서 저렇게 쓰고 있네요 :D



dasomoli의 블로그(http://dasomoli.org)
dasomoli = DasomOLI = Dasom + DOLI = 다솜돌이
다솜 = 사랑하옴의 옛 고어.
Developer! ubuntu-ko! 다솜돌이 정석
sound79의 이미지

네 그렇군요..
감사합니다..