Man page - va_start(3)

Packages contains this manual

Available languages:

en fr pl ja ru ro de

Manual

STDARG

名 前
書 åŧ
čĒŦ 明
va_start()
va_arg()
va_end()
va_copy()
åąž 性
æē– 拠
バ グ
例
é–ĸ 逪 項 į›Ž
こ ぎ 文 書 ãĢ つ い ãĻ

名 前

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 型 が åŽŖ 言 さ れ ãĻ お り 、 3 つ ぎ マ ク ロ が 厚 įžŠ さ れ ãĻ い る 。 こ れ ら を ᔍ い る と 、 å‘ŧ ãŗ å‡ē さ れ た é–ĸ 数 側 で は 個 数 や 型 を įŸĨ ら ãĒ い åŧ• 数 ぎ ãƒĒ ゚ ト を 、 順 ãĢ 一 つ ãĨ つ čĒ­ ãŋ čžŧ む こ と が で き る 。

å‘ŧ ãŗ å‡ē さ れ る é–ĸ 数 で は 、 va_list 型 ぎ ã‚Ē ブ ジ ェ ク ト が åŽŖ 言 さ れ ãĻ い ãĒ け れ ば ãĒ ら ãĒ い 。 こ ぎ ã‚Ē ブ ジ ェ ク ト が va_start (), va_arg (), va_end () ぎ 各 マ ク ロ ãĢ よ ãŖ ãĻ æ‰ą わ れ る 。

va_start()

va_start () マ ク ロ は 最 初 ãĢ å‘ŧ ãŗ å‡ē さ ãĒ け れ ば ãĒ ら ãĒ い 。 こ れ は ap を 初 期 化 し 、 va_arg () と va_end () で ᔍ い る こ と が で き る よ う ãĢ す る 。

åŧ• 数 last は åŧ• 数 ãƒĒ ゚ ト ぎ う ãĄ 、 可 変 ãĒ 部 分 ぎ į›´ 前 ãĢ įŊŽ ã‹ れ る åŧ• 数 ぎ 名 前 で あ る 。 つ ぞ り å‘ŧ ãŗ å‡ē さ れ た é–ĸ 数 が 型 を įŸĨ ãŖ ãĻ い る 最 垌 ぎ åŧ• 数 で あ る 。

こ ぎ åŧ• 数 は ãƒŦ ジ ゚ ã‚ŋ ãƒŧ 変 数 や é–ĸ 数 、 配 列 と し ãĻ åŽŖ 言 し ãĻ は ãĒ ら ãĒ い 。 こ ぎ åŧ• 数 ぎ ã‚ĸ ド ãƒŦ ゚ が va_start () マ ク ロ で ᔍ い ら れ る か も し れ ãĒ い か ら で あ る 。

va_arg()

va_arg () マ ク ロ は 、 å‘ŧ ãŗ å‡ē し 時 ãĢ 指 厚 さ れ た åŧ• 数 ぎ う ãĄ 、 æŦĄ ぎ äŊ įŊŽ ãĢ あ る も ぎ を 指 厚 し た 型 type ぎ 値 と し ãĻ 取 åž— す る 。 åŧ• 数 ap は va_list ap で 、 va_start () ãĢ よ ãŖ ãĻ 初 期 化 さ れ ãĻ い る åŋ… čρ が あ る 。 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 ãĢ ã‚ŗ ピ ãƒŧ す る 。 動 äŊœ は 、 last åŧ• 数 ãĢ dest を æ¸Ą し ãĻ va_start () を dest ãĢ 遊 ᔍ し 、 そ れ か ら src が įž 在 ぎ įŠļ 態 ãĢ 達 す る ぞ で ãĢ å‘ŧ ãŗ å‡ē し た ぎ と 同 じ 回 数 だ け va_arg () を å‘ŧ ãŗ å‡ē す 、 ぎ と 同 じ こ と を 行 う 。

す ぐ 分 か る va_list ぎ 原 čŖ… は 、 variadic ãĒ é–ĸ 数 ぎ ゚ ã‚ŋ ッ ク フ ãƒŦ ãƒŧ ム ぎ ポ イ ãƒŗ ã‚ŋ ãƒŧ で あ る 。 こ ぎ よ う ãĒ å ´ 合 (ãģ と ん お は そ う で あ る )、 単 ãĢ äģĨ 下 ぎ よ う ãĢ す れ ば い い よ う ãĢ 思 え る 。

va_list aq = ap;

掋 åŋĩ ãĒ が ら 、 (長 さ 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 () を 同 じ é–ĸ 数 内 で 原 行 し ãĒ け れ ば ãĒ ら ãĒ い 。 こ ぎ 名 前 は ぞ だ draft proposal ãĒ ぎ で 、 va_copy () ぎ äģŖ ã‚ り ãĢ __va_copy を ᔍ い る ã‚ˇ ゚ テ ム も あ る 。

åąž 性

こ ぎ ᝀ で äŊŋ ᔍ さ れ ãĻ い る ᔍ čĒž ぎ čĒŦ 明 ãĢ つ い ãĻ は 、 attributes (7) を 参 į…§ 。

Image grohtml-20398-1.png

æē– 拠

va_start (), va_arg (), va_end () マ ク ロ は C89 æē– 拠 で あ る 。 va_copy () は C99 で 厚 įžŠ さ れ ãĻ い る 。

バ グ

Unlike the historical varargs macros, the stdarg macros do not permit programmers to code a function with no fixed arguments. This problem generates work mainly when converting varargs code to stdarg code, but it also creates difficulties for variadic functions that wish to pass all of their arguments on to a function that takes a va_list argument, such as vfprintf (3).

例

é–ĸ 数 foo は 書 åŧ 文 字 か ら ãĒ る 文 字 列 を 受 け å…Ĩ れ 、 そ ぎ 書 åŧ 文 字 ãĢ 寞 åŋœ す る 型 で 可 変 個 ぎ åŧ• 数 を čĒ­ ãŋ čžŧ ãŋ 、 印 字 す る 。

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

void
foo(char *fmt, ...) /* '...' is C syntax for a variadic function */

{
va_list ap;
int d;
char c;
char *s;

va_start(ap, fmt);
while (*fmt)
switch (*fmt++) {
case 's': /* string */
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 */
/* need a cast here since va_arg only
takes fully promoted types */
c = (char) va_arg(ap, int);
printf("char %c\n", c);
break;
}
va_end(ap);
}

é–ĸ 逪 項 į›Ž

vprintf (3), vscanf (3), vsyslog (3)

こ ぎ 文 書 ãĢ つ い ãĻ

こ ぎ man ペ ãƒŧ ジ は Linux man-pages プ ロ ジ ェ ク ト ぎ ãƒĒ ãƒĒ ãƒŧ ゚ 5.10 ぎ 一 部 で あ る 。 プ ロ ジ ェ ク ト ぎ čĒŦ 明 と バ グ å ą 告 ãĢ é–ĸ す る 情 å ą は https://www.kernel.org/doc/man-pages/ ãĢ 書 か れ ãĻ い る 。