갯수가 정해지지 않은 함수의 파라메터 넘기기

macmac83638의 이미지

예를 들어 printf(char* format, ...) 과 같은 것이 있고..
제가 myPrintf(int mode, char* format, ...) 라는 것을 만들어서

myPrintf(int mode, char* format, ...)
{
       if (mode > currentMode) {
            printf(format, ...); <- 위의 파라메터를 그대로 넘기고 싶습니다.
       }
}

이렇게 하고 싶은데.. va_list나 va_start를 꼭 써야 가능한건지요 ?
만일 그렇다면 어떻게 해야 하는지 알고 싶습니다만..

pynoos의 이미지

네 va_list를 사용해야하며, vprintf 를 호출하시면 됩니다.

macmac83638의 이미지

호출될 함수가 printf가 아니구요..
다른 사용자가 정의한 함수인데, 그 함수 내부를 손댈수는 없고
역시 파라메터를 char* format, ... 형태로 넘겨야 해서..
이 경우에 va_list를 넘겨도 상관이 없는건가요 ?

Freedom is Just Another Word for Nothing Left to Lose

pynoos의 이미지

아니요... 그렇지 않습니다.

그 함수가 va_list 버전을 제공하지 않으면 힘들것 같은데요...

liongo의 이미지

갯수가 정해지지 않앗다라....

그갯수가 그리 많지 않다면. 좀 지저분하게 하는 방법이있습니다...

myPrintf(int mode, char* format, ...)

...을.. void* a=NULL, void* b=NUL, void* c=NULL로 정의하시면 가능합니다..

일단 넘기는것만은요... 인자수가 설정된 파라미터 수보다 적더라도 NULL

디폴트기 때문에 없으면 NULL로 처리됩니다.. 유의하시고요..

printf같은 성격으로 사용하시려면.. myprint를 직접 구현하셔야겠죠..

어떤식으로 구현하실지몰라서 그냥 저렇게 꽁수로 할수도있다는 잡생각이

들어서 끄적여 봅니다.. 물론 거의 사용하지 않습니다 지저분해서 -_- ;;;

다른방법 깔끔한 방법은 위님이 적으신데로 입니다..

그럼...~

' 형식이 내용을 규정한다. '

moonzoo의 이미지

pynoos님이 말씀하신데로 va_list 와 v~계열의 printf 를 쓰시면

가능합니다. 물론 myPrintf(...) 만들어서 모듈화 하는 것도 가능합니다.

다음은 간단한 예제를 만들어 봤습니다..

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

#define MAX_LOG_LEN 1024

void    mylog(char * format, ...);

int main()
{
    mylog("%d %d %s",99,1000,"test");

}

void    mylog(char * format, ...)
{
    va_list ap;

    char buff[MAX_LOG_LEN];

    memset(buff,    0x00,   MAX_LOG_LEN );

    va_start(ap,format);
    vsnprintf(buff, MAX_LOG_LEN,format,ap);

    printf("\n[%s]\n",buff);

    va_end(ap);
    return ;
}

대략 도움이 되었길.

pynoos의 이미지

va_list 를 인자로 받는 함수 없이 생략형만 제공하는 API 가 있을 때는..
그 사이에 어떤 wrapper를 만든다는 것은 사실 이론상 피해야합니다.

그 wrapper를 호출했을 때의 stack에 쌓인 인자의 개수를 알 수 없기 때문에,
wrapper안에서 원 함수를 호출할 수 없기 때문입니다.

가능한 방법을 찾는다면 그것은 그 컴파일러만을 위한 꽁수로 나올 수 밖에 없습니다.

원 소스 저작자에게 v~계열을 만들어 달라고 하시는 것이 좋을 것 같습니다.

macmac83638의 이미지

네. 감사합니다.

Freedom is Just Another Word for Nothing Left to Lose

yeppiguy의 이미지

매크로는 어떤가요?

#define myPrintf(mode, fmt,args...) \
{ \
       if (mode > currentMode) { \
            printf(fmt, ## args); \
      } \
}

근데, gcc 컴파일러에서만 먹히더군요... 다른 컴파일러에서는 곤란하구요...^^

M.W.Park의 이미지

yeppiguy wrote:
매크로는 어떤가요?

#define myPrintf(mode, fmt,args...) \
{ \
       if (mode > currentMode) { \
            printf(fmt, ## args); \
      } \
}

근데, gcc 컴파일러에서만 먹히더군요... 다른 컴파일러에서는 곤란하구요...^^

VC에서도 됩니다. 한 6년전쯤에 확실히 됐었는데... 지금은 안될지도...8)
토큰 붙여주는 거는 ANSI C 표준 이었던 것같기도 하고... 아닌것 같기도 하고... ^^;

-----
오늘 의 취미는 끝없는, 끝없는 인내다. 1973 法頂

lutanist의 이미지

M.W.Park wrote:
yeppiguy wrote:
매크로는 어떤가요?

#define myPrintf(mode, fmt,args...) \
{ \
       if (mode > currentMode) { \
            printf(fmt, ## args); \
      } \
}

근데, gcc 컴파일러에서만 먹히더군요... 다른 컴파일러에서는 곤란하구요...^^

VC에서도 됩니다. 한 6년전쯤에 확실히 됐었는데... 지금은 안될지도...8)
토큰 붙여주는 거는 ANSI C 표준 이었던 것같기도 하고... 아닌것 같기도 하고... ^^;

표준이 맞습니다. 그런데 c99 표준입니다.
덕분에 지원 못하는 컴파일러들이 있습니다.
저도 이걸 사용하다가 AIX 4.3.3에서 xlc 컴파일러 사용했다가
다시 다 뜯어고친 경험이 있네요.
참고하시기 바랍니다.

doldori의 이미지

lutanist wrote:
M.W.Park wrote:
yeppiguy wrote:
매크로는 어떤가요?

#define myPrintf(mode, fmt,args...) \
{ \
       if (mode > currentMode) { \
            printf(fmt, ## args); \
      } \
}

근데, gcc 컴파일러에서만 먹히더군요... 다른 컴파일러에서는 곤란하구요...^^

VC에서도 됩니다. 한 6년전쯤에 확실히 됐었는데... 지금은 안될지도...8)
토큰 붙여주는 거는 ANSI C 표준 이었던 것같기도 하고... 아닌것 같기도 하고... ^^;

표준이 맞습니다. 그런데 c99 표준입니다.
덕분에 지원 못하는 컴파일러들이 있습니다.
저도 이걸 사용하다가 AIX 4.3.3에서 xlc 컴파일러 사용했다가
다시 다 뜯어고친 경험이 있네요.
참고하시기 바랍니다.


이것은 표준이 아니라 gcc의 확장입니다. C99 표준에 따른다면
#define myPrintf(mode, fmt, ...) \ 
{ \ 
       if (mode > currentMode) { \ 
            printf(fmt, __VA_ARGS__); \ 
      } \ 
}

로 해야 합니다.

댓글 달기

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