stdarg(3) - wariua/manpages-ko GitHub Wiki

NAME

stdarg, va_start, va_arg, va_end, va_copy - κ°€λ³€ 인자 λͺ©λ‘

SYNOPSIS

#include <stdarg.h>

void va_start(va_list ap, last);
type va_arg(va_list ap, type);
void va_end(va_list ap);
void va_copy(va_list dest, va_list src);

DESCRIPTION

κ°€λ³€ νƒ€μž…μ˜ κ°€λ³€ 개수 인자둜 ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•  수 μžˆλ‹€. 포함 파일 <stdarg.h>μ—μ„œ νƒ€μž… va_listλ₯Ό μ„ μ–Έν•˜κ³  μ„Έ κ°€μ§€ 맀크둜λ₯Ό μ •μ˜ν•˜λŠ”λ°, 이λ₯Ό μ΄μš©ν•΄ ν”Όν˜ΈμΆœ ν•¨μˆ˜μ—κ²Œ κ°œμˆ˜μ™€ νƒ€μž…μ΄ μ•Œλ €μ Έ μžˆμ§€ μ•Šμ€ μΈμžλ“€μ˜ λͺ©λ‘μ„ μˆœνšŒν•  수 μžˆλ‹€.

ν”Όν˜ΈμΆœ ν•¨μˆ˜μ—μ„œ va_list νƒ€μž… 객체λ₯Ό μ„ μ–Έν•΄μ•Ό ν•˜λ©° κ·Έ 객체λ₯Ό 맀크둜 va_start(), va_arg(), va_end()μ—μ„œ μ‚¬μš©ν•œλ‹€.

va_start()

va_start() λ§€ν¬λ‘œλŠ” 이후 va_arg() 및 va_end()κ°€ μ“Έ 수 있게 apλ₯Ό μ΄ˆκΈ°ν™” ν•˜λ©°, λ”°λΌμ„œ κ°€μž₯ λ¨Όμ € ν˜ΈμΆœν•΄μ•Ό ν•œλ‹€.

인자 lastλŠ” κ°€λ³€ 인자 λͺ©λ‘ μ „μ˜ λ§ˆμ§€λ§‰ 인자, 즉 호좜 ν•¨μˆ˜μ—μ„œ νƒ€μž…μ„ μ•Œκ³  μžˆλŠ” λ§ˆμ§€λ§‰ 인자의 이름이닀.

이 인자의 μ£Όμ†Œλ₯Ό va_start() 맀크둜 λ‚΄μ—μ„œ μ‚¬μš©ν•  μˆ˜λ„ μžˆμœΌλ―€λ‘œ λ ˆμ§€μŠ€ν„° λ³€μˆ˜λ‘œ μ„ μ–Έλ˜μ–΄ μžˆκ±°λ‚˜ ν•¨μˆ˜λ‚˜ λ°°μ—΄ νƒ€μž…μœΌλ‘œ μ„ μ–Έλ˜μ–΄ μžˆμ–΄μ„  μ•ˆ λœλ‹€.

va_arg()

va_arg() λ§€ν¬λ‘œλŠ” 호좜의 λ‹€μŒ 인자의 νƒ€μž…κ³Ό 값을 κ°€μ§„ μ‹μœΌλ‘œ ν™•μž₯λœλ‹€. 인자 apλŠ” va_start()둜 μ΄ˆκΈ°ν™” ν•œ va_list ap이닀. va_arg()λ₯Ό ν˜ΈμΆœν•  λ•Œλ§ˆλ‹€ apλ₯Ό λ³€κ²½ν•΄μ„œ λ‹€μŒ 호좜 λ•Œ λ‹€μŒ 인자λ₯Ό λ°˜ν™˜ν•˜λ„λ‘ ν•œλ‹€. 인자 type은 νƒ€μž… μ΄λ¦„μœΌλ‘œ, type에 *만 뢙이면 μ§€μ •ν•œ νƒ€μž…μ˜ 객체에 λŒ€ν•œ 포인터 νƒ€μž…μ„ 얻을 수 μžˆλ„λ‘ μ§€μ •ν•œλ‹€.

va_start() 맀크둜 λ‹€μŒμœΌλ‘œ 처음 va_arg() 맀크둜λ₯Ό μ“°λ©΄ last λ‹€μŒ 인자λ₯Ό λ°˜ν™˜ν•œλ‹€. μ΄μ–΄μ§€λŠ” 호좜이 λ‚˜λ¨Έμ§€ μΈμžλ“€μ˜ 값을 λ°˜ν™˜ν•œλ‹€.

λ‹€μŒ μΈμžκ°€ μ—†κ±°λ‚˜ type이 (κΈ°λ³Έ 인자 승격 방식에 따라 승격된) μ‹€μ œ λ‹€μŒ 인자의 νƒ€μž…κ³Ό ν˜Έν™˜λ˜μ§€ μ•ŠλŠ” 경우 μ •ν•΄μ Έ μžˆμ§€ μ•Šμ€ 였λ₯˜κ°€ λ°œμƒν•˜κ²Œ λœλ‹€.

apλ₯Ό μ–΄λ–€ ν•¨μˆ˜λ‘œ μ „λ‹¬ν•˜κ³  κ·Έ ν•¨μˆ˜μ—μ„œ va_arg(ap,type)을 μ‚¬μš©ν•˜λŠ” κ²½μš°μ— ν•¨μˆ˜ λ°˜ν™˜ ν›„ ap의 값은 κ·œμ •λ˜μ–΄ μžˆμ§€ μ•Šλ‹€.

va_end()

각 va_start() ν˜ΈμΆœμ—λŠ” 같은 ν•¨μˆ˜ 내에 λŒ€μ‘ν•˜λŠ” va_end() 호좜이 μžˆμ–΄μ•Ό ν•œλ‹€. va_end(ap) 호좜 ν›„ λ³€μˆ˜ apλŠ” κ·œμ •λ˜μ–΄ μžˆμ§€ μ•Šλ‹€. va_start()와 va_end()둜 각각 κ°μ‹Έμ„œ λͺ©λ‘μ„ μ—¬λŸ¬ 번 μˆœνšŒν•˜λŠ” 것이 κ°€λŠ₯ν•˜λ‹€. va_end()κ°€ 맀크둜일 μˆ˜λ„ 있고 ν•¨μˆ˜μΌ μˆ˜λ„ μžˆλ‹€.

va_copy()

va_copy() λ§€ν¬λ‘œλŠ” (μ•žμ„œ μ΄ˆκΈ°ν™” ν•œ) κ°€λ³€ 인자 λͺ©λ‘ srcλ₯Ό dest둜 λ³΅μ‚¬ν•œλ‹€. dest에 같은 last 인자둜 va_start()λ₯Ό μ μš©ν•˜κ³  μ΄μ–΄μ„œ ν˜„μž¬ src μƒνƒœμ— λ„λ‹¬ν•˜κΈ°κΉŒμ§€ ν•œ 것과 같은 횟수의 va_arg() ν˜ΈμΆœμ„ μ μš©ν•œ κ²ƒμ²˜λŸΌ λ™μž‘ν•œλ‹€.

λ‹¨μˆœ λͺ…λ°±ν•œ κ΅¬ν˜„ λ°©μ‹μ—μ„œλŠ” va_listκ°€ κ°€λ³€ 인자 ν•¨μˆ˜μ˜ μŠ€νƒ ν”„λ ˆμž„μ— λŒ€ν•œ 포인터일 것이닀. 그런 (κ°€μž₯ ν”ν•œ) λ°©μ‹μ—μ„œλŠ” λ‹€μŒ 할당이 아무 λ¬Έμ œκ°€ 없을 것이닀.

va_list aq = ap;

ν•˜μ§€λ§Œ μ•ˆνƒ€κΉκ²Œλ„ va_listλ₯Ό ν¬μΈν„°μ˜ (길이 1인) λ°°μ—΄λ‘œ λ§Œλ“œλŠ” μ‹œμŠ€ν…œλ„ 있으며, κ±°κΈ°μ„  λ‹€μŒκ³Ό 같이 ν•΄μ•Ό ν•œλ‹€.

va_list aq;
*aq = *ap;

그리고 λ ˆμ§€μŠ€ν„°λ‘œ 인자λ₯Ό μ „λ‹¬ν•˜λŠ” μ‹œμŠ€ν…œμ—μ„œλŠ” va_start()μ—μ„œ λ©”λͺ¨λ¦¬λ₯Ό ν• λ‹Ήν•΄μ„œ μΈμžλ“€μ„ μ €μž₯ν•˜κ³  va_arg()κ°€ λͺ©λ‘μ„ μˆœνšŒν•  수 μžˆλ„λ‘ λ‹€μŒ μΈμžκ°€ λ­”μ§€ ν‘œμ‹œλ„ ν•΄ 두어야 ν•  μˆ˜λ„ μžˆλ‹€. 그럼 κ·Έ ν• λ‹Ή λ©”λͺ¨λ¦¬λ₯Ό va_end()μ—μ„œ λ‹€μ‹œ ν•΄μ œν•  수 μžˆλ‹€. 이런 상황에 λŒ€μ‘ν•˜κΈ° μœ„ν•΄ C99μ—μ„œλŠ” 맀크둜 va_copy()λ₯Ό μΆ”κ°€ν•˜μ—¬ μœ„ 할당을 λ‹€μŒ μ½”λ“œλ‘œ λŒ€μ²΄ν•  수 μžˆλ„λ‘ ν•œλ‹€.

va_list aq;
va_copy(aq, ap);
...
va_end(aq);

각 va_copy() ν˜ΈμΆœμ—λŠ” 같은 ν•¨μˆ˜ 내에 λŒ€μ‘ν•˜λŠ” va_end() 호좜이 μžˆμ–΄μ•Ό ν•œλ‹€. 일뢀 μ‹œμŠ€ν…œμ—μ„œλŠ” va_copy()λ₯Ό μ œκ³΅ν•˜μ§€ μ•Šκ³  λŒ€μ‹  __va_copyκ°€ μžˆλŠ”λ°, μ œμ•ˆ μ΄ˆμ•ˆμ—μ„œ μ‚¬μš©ν–ˆλ˜ 이름이닀.

ATTRIBUTES

이 μ ˆμ—μ„œ μ‚¬μš©ν•˜λŠ” μš©μ–΄λ“€μ— λŒ€ν•œ μ„€λͺ…은 attributes(7)λ₯Ό 보라.

μΈν„°νŽ˜μ΄μŠ€ 속성 κ°’
va_start(), va_end(),
va_copy()
μŠ€λ ˆλ“œ μ•ˆμ „μ„± MT-Safe
va_arg() μŠ€λ ˆλ“œ μ•ˆμ „μ„± MT-Safe race:ap

CONFORMING TO

맀크둜 va_start(), var_arg(), va_end()λŠ” C89λ₯Ό λ”°λ₯Έλ‹€. C99μ—μ„œ va_copy() 맀크둜λ₯Ό μ •μ˜ν•œλ‹€.

BUGS

과거의 varargs λ§€ν¬λ‘œμ™€ 달리 stdarg λ§€ν¬λ‘œμ—μ„œλŠ” κ³ μ • 인자 μ—†λŠ” ν•¨μˆ˜λ₯Ό μž‘μ„±ν•˜λŠ” 것이 λΆˆκ°€λŠ₯ν•˜λ‹€. 이 λ¬Έμ œκ°€ 일을 λ§Œλ“œλŠ” 건 주둜 varargs μ½”λ“œλ₯Ό stdarg μ½”λ“œλ‘œ λ³€ν™˜ν•  λ•Œμ§€λ§Œ va_list 인자λ₯Ό λ°›λŠ” vfprintf(3) 같은 ν•¨μˆ˜λ‘œ λͺ¨λ“  인자λ₯Ό μ „λ‹¬ν•˜λ € ν•˜λŠ” κ°€λ³€ 인자 ν•¨μˆ˜μ—μ„œλ„ 어렀움이 생긴닀.

EXAMPLE

ν•¨μˆ˜ fooλŠ” μ„œμ‹ λ¬Έμžμ—΄μ„ λ°›μ•„μ„œ νƒ€μž…μ— 따라 각 μ„œμ‹ λ¬Έμžμ— μ—°κ³„λœ 인자λ₯Ό μ°λŠ”λ‹€.

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

void
foo(char *fmt, ...)   /* '...'은 C의 κ°€λ³€ ν•¨μˆ˜ 문법 */
{
    va_list ap;
    int d;
    char c, *s;

    va_start(ap, fmt);
    while (*fmt)
        switch (*fmt++) {
        case 's':              /* λ¬Έμžμ—΄ */
            s = va_arg(ap, char *);
            printf("string %s\n", s);
            break;
        case 'd':              /* int */
            d = va_arg(ap, int);
            printf("int %d\n", d);
            break;
        case 'c':              /* char */
            /* μ™„μ „νžˆ 승격된 νƒ€μž…μ„ va_argκ°€
               λ°›μœΌλ―€λ‘œ 캐슀트 ν•„μš” */
            c = (char) va_arg(ap, int);
            printf("char %c\n", c);
            break;
        }
    va_end(ap);
}

2019-05-09

⚠️ **GitHub.com Fallback** ⚠️