va_list 에 관해서...

leolo의 이미지

대부분 stdarg.h 를 이용하던데, 저는 varargs.h 를 이용하려고 합니다.
그런데, stdarg.h를 사용하는 것과 varargs.h 사용하는데 사용하는
매크로의 형식이 다른가요?
예를 들어 va_start()의 인자 수가 다르거나...

variable argument 함수를 이용해서 문자열을 뽑아내고 있는데,
va_arg() 에서 마지막임을 알아내는 방법을 모르겠습니다.

------------------------------------------------------------------
void test1(va_alist)
va_dcl
{
va_list vaArgs;
char *args[100];
int nArgs = 0;

va_start(vaArgs);

while ( (args[nArgs++] = va_arg(vaArgs, char *)) != NULL ) <----- 이 부분 !
{
......
}

va_end(vaArgs);

......
}
------------------------------------------------------------------

va_arg() 의 결과에서 어떻게 확인해야 마지막인지 알 수 있을까요?

stdarg.h 에서는 호환성 있는 방법이 없는 것으로 알고 있는데.
한가지 방법으로 인자의 갯수를 가변인자로 전달하는 방법이 있는 것으로
알고 있는데 다른 방법은 없는지요..

lsj0713의 이미지

왜 굳이 varargs.h 를 사용하려 하시는지요... 표준에서 stdargs.h를 쓰기로 결정한지도 벌써 14년이 지났습니다. 이제 표준에서 varargs란 단어는 단 한번도 나오질 않습니다. 또한 varargs.h나 stdargs.h나 성능이나 편리함 같은 면에서는 전혀 차이가 없습니다.

그리고 올리신 소스 코드는 ANSI C 이전의 비원형 선언방식을 사용하셨는데 이 또한 좋지 않은 방식입니다.

어쨌거나, 가변 인자 함수 내부에서 넘겨받은 매개변수의 수나 타입을 알아낼 수 있는 방법은 전혀 없습니다. 따라서 다른 방법으로 매개변수의 수와 타입을 넘겨주어야 합니다. printf 함수나 scanf 함수의 경우에는 형식 문자열이 바로 그와 같은 역할을 하고 있습니다. 만약 넘겨 받는 가변 인자들이 모두 같은 타입을 가지는 것이 확실하다면, 가변 인자의 갯수만 따로 넘겨 주던가 아니면 가장 마지막 가변 인자를 0(또는 다른 값과 구별되는 특별한 값)으로 주는 방법을 쓸 수도 있습니다.

위에 올리신 소스 코드는 아마도 가장 마지막 매개변수로 널 포인터를 주는 그런 가변인자 함수 같습니다. 사용하기 위해서는 아마도 다음과 같이 하면 되겠지요.

char *str1 = "abc";
char *str2 = "def";

test1(str1, str2, NULL);

댓글 달기

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