stdarg(3) - wariua/manpages-ko GitHub Wiki
stdarg, va_start, va_arg, va_end, va_copy - κ°λ³ μΈμ λͺ©λ‘
#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);
κ°λ³ νμ
μ κ°λ³ κ°μ μΈμλ‘ ν¨μλ₯Ό νΈμΆν μ μλ€. ν¬ν¨ νμΌ <stdarg.h>
μμ νμ
va_list
λ₯Ό μ μΈνκ³ μΈ κ°μ§ λ§€ν¬λ‘λ₯Ό μ μνλλ°, μ΄λ₯Ό μ΄μ©ν΄ νΌνΈμΆ ν¨μμκ² κ°μμ νμ
μ΄ μλ €μ Έ μμ§ μμ μΈμλ€μ λͺ©λ‘μ μνν μ μλ€.
νΌνΈμΆ ν¨μμμ va_list
νμ
κ°μ²΄λ₯Ό μ μΈν΄μΌ νλ©° κ·Έ κ°μ²΄λ₯Ό λ§€ν¬λ‘ va_start()
, va_arg()
, va_end()
μμ μ¬μ©νλ€.
va_start()
λ§€ν¬λ‘λ μ΄ν va_arg()
λ° va_end()
κ° μΈ μ μκ² ap
λ₯Ό μ΄κΈ°ν νλ©°, λ°λΌμ κ°μ₯ λ¨Όμ νΈμΆν΄μΌ νλ€.
μΈμ last
λ κ°λ³ μΈμ λͺ©λ‘ μ μ λ§μ§λ§ μΈμ, μ¦ νΈμΆ ν¨μμμ νμ
μ μκ³ μλ λ§μ§λ§ μΈμμ μ΄λ¦μ΄λ€.
μ΄ μΈμμ μ£Όμλ₯Ό va_start()
λ§€ν¬λ‘ λ΄μμ μ¬μ©ν μλ μμΌλ―λ‘ λ μ§μ€ν° λ³μλ‘ μ μΈλμ΄ μκ±°λ ν¨μλ λ°°μ΄ νμ
μΌλ‘ μ μΈλμ΄ μμ΄μ μ λλ€.
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_start()
νΈμΆμλ κ°μ ν¨μ λ΄μ λμνλ va_end()
νΈμΆμ΄ μμ΄μΌ νλ€. va_end(ap)
νΈμΆ ν λ³μ ap
λ κ·μ λμ΄ μμ§ μλ€. va_start()
μ va_end()
λ‘ κ°κ° κ°μΈμ λͺ©λ‘μ μ¬λ¬ λ² μννλ κ²μ΄ κ°λ₯νλ€. va_end()
κ° λ§€ν¬λ‘μΌ μλ μκ³ ν¨μμΌ μλ μλ€.
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(7)λ₯Ό 보λΌ.
μΈν°νμ΄μ€ | μμ± | κ° |
---|---|---|
va_start() , va_end() ,va_copy()
|
μ€λ λ μμ μ± | MT-Safe |
va_arg() |
μ€λ λ μμ μ± | MT-Safe race:ap |
λ§€ν¬λ‘ va_start()
, var_arg()
, va_end()
λ C89λ₯Ό λ°λ₯Έλ€. C99μμ va_copy()
λ§€ν¬λ‘λ₯Ό μ μνλ€.
κ³Όκ±°μ varargs λ§€ν¬λ‘μ λ¬λ¦¬ stdarg λ§€ν¬λ‘μμλ κ³ μ μΈμ μλ ν¨μλ₯Ό μμ±νλ κ²μ΄ λΆκ°λ₯νλ€. μ΄ λ¬Έμ κ° μΌμ λ§λλ 건 μ£Όλ‘ varargs μ½λλ₯Ό stdarg μ½λλ‘ λ³νν λμ§λ§ va_list
μΈμλ₯Ό λ°λ vfprintf(3) κ°μ ν¨μλ‘ λͺ¨λ μΈμλ₯Ό μ λ¬νλ € νλ κ°λ³ μΈμ ν¨μμμλ μ΄λ €μμ΄ μκΈ΄λ€.
ν¨μ 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