<!DOCTYPE html>
<html class="client-nojs vector-feature-language-in-header-enabled vector-feature-language-in-main-menu-disabled vector-feature-language-in-main-page-header-disabled vector-feature-page-tools-pinned-disabled vector-feature-toc-pinned-clientpref-0 vector-toc-not-available vector-feature-main-menu-pinned-disabled vector-feature-limited-width-clientpref-1 vector-feature-limited-width-content-enabled vector-feature-custom-font-size-clientpref-1 vector-feature-appearance-pinned-clientpref-0 skin-theme-clientpref-os vector-sticky-header-enabled skin-thumbsize-clientpref-standard" lang="zh" dir="ltr"><head>
    <meta charset="UTF-8">
    <title>Stdarg.h</title>
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link rel="icon" type="image/png" href="./_res_/favicon.png">
    <link rel="canonical" href="https://zh.wikipedia.org/wiki/Stdarg.h"> <link href="./_mw_/ext.cite.styles.css" rel="stylesheet" type="text/css">
    <link href="./_mw_/ext.pygments.css" rel="stylesheet" type="text/css">
    <link href="./_mw_/ext.wikimediamessages.styles.css" rel="stylesheet" type="text/css">
    <link href="./_mw_/skins.vector.icons.css" rel="stylesheet" type="text/css">
    <link href="./_mw_/skins.vector.search.codex.styles.css" rel="stylesheet" type="text/css">
    <link href="./_mw_/skins.vector.styles.css" rel="stylesheet" type="text/css">
    <meta name="ResourceLoaderDynamicStyles" content="">
    <link href="./_mw_/ext.gadget.large-font.css" rel="stylesheet" type="text/css">
    <link href="./_mw_/ext.gadget.text-spacing.css" rel="stylesheet" type="text/css">
    <link rel="stylesheet" type="text/css" href="./_mw_/site.styles.css">
    <link rel="stylesheet" type="text/css" href="./_mw_/noscript.css">
    <link rel="stylesheet" type="text/css" href="./_res_/footer.css">
    <link rel="stylesheet" type="text/css" href="./_res_/vector-2022.css">
  </head>
  <body class="skin--responsive skin-vector skin-vector-search-vue mediawiki ltr sitedir-ltr mw-hide-empty-elt ns-0 ns-subject page-Stdarg_h rootpage-Stdarg_h skin-vector-2022 action-view">
    <div class="mw-page-container">
      <div class="mw-page-container-inner">
        <div class="mw-content-container">
          <main id="content" class="mw-body">
            <header class="mw-body-header vector-page-titlebar">
              <h1 id="firstHeading" class="firstHeading mw-first-heading">stdarg.h</h1>
            </header>
            <a id="top"></a>
            <div id="bodyContent" class="vector-body ve-init-mw-desktopArticleTarget-targetContainer" aria-labelledby="firstHeading" data-mw-ve-target-container="">
              <div id="contentSub">
                <div id="mw-content-subtitle"></div>
              </div>
              <div id="mw-content-text" class="mw-body-content mw-content-ltr" lang="zh" dir="ltr"><div class="mw-content-ltr mw-parser-output" lang="zh" dir="ltr"><div id="noteTA-f36523b6" class="noteTA"><div class="noteTA-group"><div data-noteta-group-source="module" data-noteta-group="IT"></div></div><div class="noteTA-local"><div data-noteta-code="zh-hans:函数;zh-hant:函式;"></div><div data-noteta-code="zh-hans:返回;zh-hant:回傳;"></div><div data-noteta-code="zh-hans:数据类型;zh-hant:型態;"></div><div data-noteta-code="zh-hans:声明;zh-hant:宣告;"></div><div data-noteta-code="zh-hans:变量;zh-hant:變數;"></div><div data-noteta-code="zh-hans:调用;zh-hant:呼叫;"></div></div></div>
<p class="mw-empty-elt">
</p>
<style data-mw-deduplicate="TemplateStyles:r84265675">
/* start https://zh.wikipedia.org/ */


.mw-parser-output .hlist dl,.mw-parser-output .hlist ol,.mw-parser-output .hlist ul{margin:0;padding:0}.mw-parser-output .hlist dd,.mw-parser-output .hlist dt,.mw-parser-output .hlist li{margin:0;display:inline}.mw-parser-output .hlist.inline,.mw-parser-output .hlist.inline dl,.mw-parser-output .hlist.inline ol,.mw-parser-output .hlist.inline ul,.mw-parser-output .hlist dl dl,.mw-parser-output .hlist dl ol,.mw-parser-output .hlist dl ul,.mw-parser-output .hlist ol dl,.mw-parser-output .hlist ol ol,.mw-parser-output .hlist ol ul,.mw-parser-output .hlist ul dl,.mw-parser-output .hlist ul ol,.mw-parser-output .hlist ul ul{display:inline}.mw-parser-output .hlist .mw-empty-li{display:none}.mw-parser-output .hlist dt::after{content:" :"}.mw-parser-output .hlist dd::after,.mw-parser-output .hlist li::after{content:" · ";font-weight:bold}.mw-parser-output .hlist-pipe dd::after,.mw-parser-output .hlist-pipe li::after{content:" | ";font-weight:normal}.mw-parser-output .hlist-hyphen dd::after,.mw-parser-output .hlist-hyphen li::after{content:" - ";font-weight:normal}.mw-parser-output .hlist-comma dd::after,.mw-parser-output .hlist-comma li::after{content:"、";font-weight:normal}.mw-parser-output .hlist dd:last-child::after,.mw-parser-output .hlist dt:last-child::after,.mw-parser-output .hlist li:last-child::after{content:none}.mw-parser-output .hlist ol{counter-reset:listitem}.mw-parser-output .hlist ol>li{counter-increment:listitem}.mw-parser-output .hlist ol>li::before{content:" "counter(listitem)"\a0 "}.mw-parser-output .hlist dd ol>li:first-child::before,.mw-parser-output .hlist dt ol>li:first-child::before,.mw-parser-output .hlist li ol>li:first-child::before{content:"（"counter(listitem)"\a0 "}.mw-parser-output ul.cslist,.mw-parser-output ul.sslist{margin:0;padding:0;display:inline-block;list-style:none}.mw-parser-output .cslist li,.mw-parser-output .sslist li{margin:0;display:inline-block}.mw-parser-output .cslist li::after{content:"，"}.mw-parser-output .sslist li::after{content:"；"}.mw-parser-output .cslist li:last-child::after,.mw-parser-output .sslist li:last-child::after{content:none}


/* end   https://zh.wikipedia.org/ */
</style><style data-mw-deduplicate="TemplateStyles:r84913072">
/* start https://zh.wikipedia.org/ */


.mw-parser-output .sidebar{width:22em;float:right;clear:right;margin:0.5em 0 1em 1em;background:var(--background-color-neutral-subtle,#f8f9fa);border:1px solid var(--border-color-base,#a2a9b1);padding:0.2em;text-align:center;line-height:1.4em;font-size:88%;border-collapse:collapse;display:table}body.skin-minerva .mw-parser-output .sidebar{display:table!important;float:right!important;margin:0.5em 0 1em 1em!important}.mw-parser-output .sidebar-subgroup{width:100%;margin:0;border-spacing:0}.mw-parser-output .sidebar-left{float:left;clear:left;margin:0.5em 1em 1em 0}.mw-parser-output .sidebar-none{float:none;clear:both;margin:0.5em 1em 1em 0}.mw-parser-output .sidebar-outer-title{padding:0 0.4em 0.2em;font-size:125%;line-height:1.2em;font-weight:bold}.mw-parser-output .sidebar-top-image{padding:0.4em}.mw-parser-output .sidebar-top-caption,.mw-parser-output .sidebar-pretitle-with-top-image,.mw-parser-output .sidebar-caption{padding:0.2em 0.4em 0;line-height:1.2em}.mw-parser-output .sidebar-pretitle{padding:0.4em 0.4em 0;line-height:1.2em}.mw-parser-output .sidebar-title,.mw-parser-output .sidebar-title-with-pretitle{padding:0.2em 0.8em;font-size:145%;line-height:1.2em}.mw-parser-output .sidebar-title-with-pretitle{padding:0.1em 0.4em}.mw-parser-output .sidebar-image{padding:0.2em 0.4em 0.4em}.mw-parser-output .sidebar-heading{padding:0.1em 0.4em}.mw-parser-output .sidebar-content{padding:0 0.5em 0.4em}.mw-parser-output .sidebar-content-with-subgroup{padding:0.1em 0.4em 0.2em}.mw-parser-output .sidebar-above,.mw-parser-output .sidebar-below{padding:0.3em 0.8em;font-weight:bold}.mw-parser-output .sidebar-collapse .sidebar-above,.mw-parser-output .sidebar-collapse .sidebar-below{border-top:1px solid #aaa;border-bottom:1px solid #aaa}.mw-parser-output .sidebar-navbar{text-align:right;font-size:100%;padding:0 0.4em 0.4em}.mw-parser-output .sidebar-list-title{padding:0 0.4em;text-align:left;font-weight:bold;line-height:1.6em;font-size:105%}.mw-parser-output .sidebar-list-title-c{padding:0 0.4em;text-align:center;margin:0 3.3em}@media(max-width:640px){body.mediawiki .mw-parser-output .sidebar{width:100%!important;clear:both;float:none!important;margin-left:0!important;margin-right:0!important}}body.skin--responsive .mw-parser-output .sidebar a>img{max-width:none!important}@media screen{html.skin-theme-clientpref-night .mw-parser-output .sidebar:not(.notheme) .sidebar-list-title,html.skin-theme-clientpref-night .mw-parser-output .sidebar:not(.notheme) .sidebar-subgroup,html.skin-theme-clientpref-night .mw-parser-output .sidebar:not(.notheme) .sidebar-pretitle,html.skin-theme-clientpref-night .mw-parser-output .sidebar:not(.notheme) .sidebar-title,html.skin-theme-clientpref-night .mw-parser-output .sidebar:not(.notheme) .sidebar-title-with-pretitle,html.skin-theme-clientpref-night .mw-parser-output .sidebar:not(.notheme) .sidebar-heading,html.skin-theme-clientpref-night .mw-parser-output .sidebar:not(.notheme) .sidebar-above,html.skin-theme-clientpref-night .mw-parser-output .sidebar:not(.notheme) .sidebar-below{background:inherit!important;color:inherit!important;border-color:#54595d!important}html.skin-theme-clientpref-night .mw-parser-output .sidebar a:not(.new):not(.mw-selflink):link{color:var(--color-progressive)!important}}@media screen and (prefers-color-scheme:dark){html.skin-theme-clientpref-os .mw-parser-output .sidebar:not(.notheme) .sidebar-list-title,html.skin-theme-clientpref-os .mw-parser-output .sidebar:not(.notheme) .sidebar-subgroup,html.skin-theme-clientpref-os .mw-parser-output .sidebar:not(.notheme) .sidebar-pretitle,html.skin-theme-clientpref-os .mw-parser-output .sidebar:not(.notheme) .sidebar-title,html.skin-theme-clientpref-os .mw-parser-output .sidebar:not(.notheme) .sidebar-title-with-pretitle,html.skin-theme-clientpref-os .mw-parser-output .sidebar:not(.notheme) .sidebar-heading,html.skin-theme-clientpref-os .mw-parser-output .sidebar:not(.notheme) .sidebar-above,html.skin-theme-clientpref-os .mw-parser-output .sidebar:not(.notheme) .sidebar-below{background:inherit!important;color:inherit!important;border-color:#54595d!important}html.skin-theme-clientpref-os .mw-parser-output .sidebar a:not(.new):not(.mw-selflink):link{color:var(--color-progressive)!important}}@media print{body.ns-0 .mw-parser-output .sidebar{display:none!important}}


/* end   https://zh.wikipedia.org/ */
</style><table class="sidebar nomobile nowraplinks"><tbody><tr><th class="sidebar-title"><a href="C%E6%A8%99%E6%BA%96%E5%87%BD%E5%BC%8F%E5%BA%AB" title="C標準函式庫">C标准函数库</a></th></tr><tr><th class="sidebar-heading">
一般</th></tr><tr><td class="sidebar-content" style="text-align: left">
<ul><li><a href="Stdlib.h#数据类型" title="Stdlib.h">数据类型</a></li>
<li><a href="Ctype.h" title="Ctype.h">字符类型</a></li>
<li><a href="String.h" title="String.h">字符串</a></li>
<li><a href="Math.h" title="Math.h">数学</a></li>
<li><a href="Stdio.h" title="Stdio.h">文件输入/输出</a></li>
<li><a href="Time.h" title="Time.h">日期/时间</a></li>
<li><a href="Locale.h" title="Locale.h">本地化</a></li>
<li><a href="Stdlib.h#函数" title="Stdlib.h">内存分配</a></li>
<li><a href="Stdlib.h#函数" title="Stdlib.h">过程控制</a></li>
<li><a href="Signal.h" title="Signal.h">信号</a></li>
<li><a href="C%E6%9B%BF%E4%BB%A3%E6%A0%87%E8%AE%B0" title="C替代标记">替代标记</a></li></ul></td>
</tr><tr><th class="sidebar-heading">
杂项</th></tr><tr><td class="sidebar-content" style="text-align: left">
<ul><li><code>&lt;<a href="Assert.h" title="Assert.h">assert.h</a>&gt;</code></li>
<li><code>&lt;<a href="Errno.h" title="Errno.h">errno.h</a>&gt;</code></li>
<li><code>&lt;<a href="Setjmp.h" title="Setjmp.h">setjmp.h</a>&gt;</code></li>
<li><code>&lt;<a class="mw-selflink selflink">stdarg.h</a>&gt;</code></li></ul></td>
</tr><tr><td class="sidebar-navbar" style="line-height:1.6"><style data-mw-deduplicate="TemplateStyles:r84244141">
/* start https://zh.wikipedia.org/ */


.mw-parser-output .navbar{display:inline;font-weight:normal}.mw-parser-output .navbar-collapse{float:left;text-align:left}.mw-parser-output .navbar-boxtext{word-spacing:0}.mw-parser-output .navbar ul{display:inline-block;white-space:nowrap;line-height:inherit}.mw-parser-output .navbar-brackets::before{margin-right:-0.125em;content:"[ "}.mw-parser-output .navbar-brackets::after{margin-left:-0.125em;content:" ]"}.mw-parser-output .navbar li{word-spacing:-0.125em}.mw-parser-output .navbar a>span,.mw-parser-output .navbar a>abbr{text-decoration:inherit}.mw-parser-output .navbar-mini abbr{font-variant:small-caps;border-bottom:none;text-decoration:none;cursor:inherit}.mw-parser-output .navbar-ct-full{font-size:110%;margin:0 8em}.mw-parser-output .navbar-ct-mini{font-size:110%;margin:0 5em}html.skin-theme-clientpref-night .mw-parser-output .navbar li a abbr{color:var(--color-base)!important}@media(prefers-color-scheme:dark){html.skin-theme-clientpref-os .mw-parser-output .navbar li a abbr{color:var(--color-base)!important}}@media print{.mw-parser-output .navbar{display:none!important}}


/* end   https://zh.wikipedia.org/ */
</style></td></tr></tbody></table>
<p><b><code>stdarg.h</code></b>是<a href="C%E8%AA%9E%E8%A8%80" class="mw-redirect" title="C語言">C語言</a>中<a href="C%E6%A8%99%E6%BA%96%E5%87%BD%E5%BC%8F%E5%BA%AB" title="C標準函式庫">C標準函式庫</a>的<a href="%E6%A8%99%E9%A0%AD%E6%AA%94" class="mw-redirect" title="標頭檔">標頭檔</a>，stdarg是由<b>st</b>andar<b>d</b>（標準） <b>arg</b>uments（參數）簡化而來，主要目的為讓函式能夠接收不定量參數。<sup id="cite_ref-1" class="reference"><a href="#cite_note-1"><span class="cite-bracket">[</span>1<span class="cite-bracket">]</span></a></sup> <a href="C%2B%2B" title="C++">C++</a>的<code>cstdarg</code>標頭檔中也提供這樣的機能；雖然與C的標頭檔是相容的，但是也有衝突存在。
</p><p><a href="%E4%B8%8D%E5%AE%9A%E5%8F%83%E6%95%B8%E5%87%BD%E5%BC%8F" class="mw-redirect" title="不定參數函式">不定參數函式</a>（Variadic functions）是<code>stdarg.h</code>內容典型的應用，雖然也可以使用在其他由不定參數函式呼叫的函式（例如，<code>vprintf</code>）。
</p>

<div class="mw-heading mw-heading2"><h2 id="宣告不定參數函式"><span id=".E5.AE.A3.E5.91.8A.E4.B8.8D.E5.AE.9A.E5.8F.83.E6.95.B8.E5.87.BD.E5.BC.8F"></span>宣告不定參數函式</h2></div>
<p>不定參數函式的參數數量是可變動的，它使用<a href="%E7%9C%81%E7%95%A5%E8%99%9F" class="mw-redirect" title="省略號">省略號</a>來忽略之後的參數。例如<code><a href="Printf" class="mw-redirect" title="Printf">printf</a></code>函式一般。代表性的宣告為:
</p>
<div class="mw-highlight mw-highlight-lang-c mw-content-ltr" dir="ltr"><pre><span></span><span class="kt">int</span><span class="w"> </span><span class="nf">check</span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">a</span><span class="p">,</span><span class="w"> </span><span class="kt">double</span><span class="w"> </span><span class="n">b</span><span class="p">,</span><span class="w"> </span><span class="p">...);</span>
</pre></div>
<p>不定參數函式最少要有一個命名的參數，所以
</p>
<div class="mw-highlight mw-highlight-lang-c mw-content-ltr" dir="ltr"><pre><span></span><span class="kt">char</span><span class="w"> </span><span class="o">*</span><span class="nf">wrong</span><span class="p">(...);</span>
</pre></div>
<p>在C是不被允許的。在C，省略符號之前必須要有逗號；在C++，則沒有這種強制要求。
（雖然在C++中，這樣的宣告是合理的，但是這種寫法，因為沒有已命名的參數，使得<code>va_start</code>沒辦法抓到動態參數的正確起始點。）
</p>
<div class="mw-heading mw-heading2"><h2 id="定義不定參數函式"><span id=".E5.AE.9A.E7.BE.A9.E4.B8.8D.E5.AE.9A.E5.8F.83.E6.95.B8.E5.87.BD.E5.BC.8F"></span>定義不定參數函式</h2></div>
<p>使用與聲明時相同的語法來定義:
</p>
<div class="mw-highlight mw-highlight-lang-c mw-content-ltr" dir="ltr"><pre><span></span><span class="kt">long</span><span class="w"> </span><span class="nf">func</span><span class="p">(</span><span class="kt">char</span><span class="p">,</span><span class="w"> </span><span class="kt">double</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="p">,</span><span class="w"> </span><span class="p">...);</span>

<span class="kt">long</span><span class="w"> </span><span class="nf">func</span><span class="p">(</span><span class="kt">char</span><span class="w"> </span><span class="n">a</span><span class="p">,</span><span class="w"> </span><span class="kt">double</span><span class="w"> </span><span class="n">b</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">c</span><span class="p">,</span><span class="w"> </span><span class="p">...)</span>
<span class="p">{</span>
<span class="w">    </span><span class="cm">/* ... */</span>
<span class="p">}</span>
</pre></div>
<p>在舊形式中可能會出現較省略的函式定義:
</p>
<div class="mw-highlight mw-highlight-lang-c mw-content-ltr" dir="ltr"><pre><span></span><span class="kt">long</span><span class="w"> </span><span class="nf">func</span><span class="p">();</span>

<span class="kt">long</span><span class="w"> </span><span class="nf">func</span><span class="p">(</span><span class="n">a</span><span class="p">,</span><span class="w"> </span><span class="n">b</span><span class="p">,</span><span class="w"> </span><span class="n">c</span><span class="p">,</span><span class="w"> </span><span class="p">...)</span>
<span class="w">    </span><span class="kt">char</span><span class="w"> </span><span class="n">a</span><span class="p">;</span>
<span class="w">    </span><span class="kt">double</span><span class="w"> </span><span class="n">b</span><span class="p">;</span>
<span class="p">{</span>
<span class="w">    </span><span class="cm">/* ... */</span>
<span class="p">}</span>
</pre></div>
<div class="mw-heading mw-heading2"><h2 id="stdarg.h数据类型"><span id="stdarg.h.E6.95.B0.E6.8D.AE.E7.B1.BB.E5.9E.8B"></span><code>stdarg.h</code>数据类型</h2></div>
<table class="wikitable">

<tbody><tr>
<th>名稱</th>
<th>描述</th>
<th>相容
</th></tr>
<tr>
<td><code>va_list</code></td>
<td>用來保存宏va_arg与宏va_end所需信息</td>
<td>C89
</td></tr></tbody></table>
<div class="mw-heading mw-heading2"><h2 id="stdarg.h巨集"><span id="stdarg.h.E5.B7.A8.E9.9B.86"></span><code>stdarg.h</code>巨集</h2></div>
<table class="wikitable">

<tbody><tr>
<th>名稱</th>
<th>描述</th>
<th>相容
</th></tr>
<tr>
<td><code>va_start</code></td>
<td>使<code>va_list</code>指向起始的參數</td>
<td>C89
</td></tr>
<tr>
<td><code>va_arg</code></td>
<td>檢索參數</td>
<td>C89
</td></tr>
<tr>
<td><code>va_end</code></td>
<td>釋放<code>va_list</code></td>
<td>C89
</td></tr>
<tr>
<td><code>va_copy</code></td>
<td>拷貝<code>va_list</code>的內容</td>
<td><a href="C99" title="C99">C99</a>
</td></tr></tbody></table>
<div class="mw-heading mw-heading2"><h2 id="存取參數"><span id=".E5.AD.98.E5.8F.96.E5.8F.83.E6.95.B8"></span>存取參數</h2></div>
<p>存取未命名的參數，首先必須在不定參數函式中宣告<code>va_list</code>型態的變數。呼叫<code>va_start</code>並傳入兩個參數：第一個參數為<code>va_list</code>型態的變數，第二個参数為函式的動態參數前面最後一個已命名的參數名稱，接著每一呼叫<code>va_arg</code>就會回傳下一個參數，<code>va_arg</code>的第一個參數為<code>va_list</code>，第二個參數為回傳的型態。最後<code>va_end</code>必須在函式回傳前被<code>va_list</code>呼叫(當作參數)。(沒有要求要讀取完所有參數)
</p><p><a href="C99" title="C99">C99</a>提供額外的巨集，<code>va_copy</code>，它能夠複製<code>va_list</code>。而<code>va_copy(va2, va1)</code>意思為拷貝<code>va1</code>到<code>va2</code>。
</p><p>沒有機制定義該怎麼判別傳遞到函式的參數量或者型態。函式通常需要知道或確定它們變化的方法。共通的慣例包含:
</p>
<ul><li>使用<code><a href="Printf" class="mw-redirect" title="Printf">printf</a></code>或<code><a href="Scanf" class="mw-redirect" title="Scanf">scanf</a></code>類的格式化字串來嵌入明確指定的型態。</li>
<li>在不定參數最後的標记值(sentinel value)。</li>
<li>總數變數來指明不定參數的數量。</li></ul>
<div class="mw-heading mw-heading2"><h2 id="型別安全性"><span id=".E5.9E.8B.E5.88.A5.E5.AE.89.E5.85.A8.E6.80.A7"></span>型別安全性</h2></div>
<p>有些C的实现，提供了对不定参数的扩展，允許編譯器檢查適當的格式化字串及標志(sentinels)的使用。如果沒有這种擴充，編譯器通常無從檢查傳入函式的未命名參數是否為所預期的型態，也不能转换它们为所需要的数据类型。因此，必須小心謹慎以确保正確性，因为不匹配的型態降到导致<a href="%E6%9C%AA%E5%AE%9A%E4%B9%89%E8%A1%8C%E4%B8%BA" title="未定义行为">未定義行為</a>(Undefined behavior)。例如，如果傳递<a href="%E7%A9%BA%E6%8C%87%E9%92%88" class="mw-redirect" title="空指针">空指针</a>，不能仅仅写入<code>NULL</code>（可能实际定义为0），还要转化为（cast）适当的指针类型。另一个考慮是未命名参数的默认的类型提升。<code>float</code>將會自動的被轉換成<code>double</code>‧同樣的比<code>int</code>(整數)更小容量的參數型態將會被轉換成<code>int</code>或者<code>unsigned int</code>‧函式所接收到的未命名參數必須預期将被型態提升。
</p>
<div class="mw-heading mw-heading2"><h2 id="例子"><span id=".E4.BE.8B.E5.AD.90"></span>例子</h2></div>
<div class="mw-highlight mw-highlight-lang-c mw-content-ltr" dir="ltr"><pre><span></span><span class="cp">#include</span><span class="w"> </span><span class="cpf">&lt;stdio.h&gt;</span>
<span class="cp">#include</span><span class="w"> </span><span class="cpf">&lt;stdarg.h&gt;</span>

<span class="kt">void</span><span class="w"> </span><span class="nf">printargs</span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">arg1</span><span class="p">,</span><span class="w"> </span><span class="p">...)</span><span class="w"> </span><span class="cm">/* 輸出所有int型態的參數，直到-1結束 */</span>
<span class="p">{</span>
<span class="w">  </span><span class="kt">va_list</span><span class="w"> </span><span class="n">ap</span><span class="p">;</span>
<span class="w">  </span><span class="kt">int</span><span class="w"> </span><span class="n">i</span><span class="p">;</span>

<span class="w">  </span><span class="n">va_start</span><span class="p">(</span><span class="n">ap</span><span class="p">,</span><span class="w"> </span><span class="n">arg1</span><span class="p">);</span><span class="w"> </span>
<span class="w">  </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="n">i</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">arg1</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="mi">-1</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">va_arg</span><span class="p">(</span><span class="n">ap</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="p">))</span>
<span class="w">    </span><span class="n">printf</span><span class="p">(</span><span class="s">"%d "</span><span class="p">,</span><span class="w"> </span><span class="n">i</span><span class="p">);</span>
<span class="w">  </span><span class="n">va_end</span><span class="p">(</span><span class="n">ap</span><span class="p">);</span>
<span class="w">  </span><span class="n">putchar</span><span class="p">(</span><span class="sc">'\n'</span><span class="p">);</span>
<span class="p">}</span>

<span class="kt">int</span><span class="w"> </span><span class="nf">main</span><span class="p">(</span><span class="kt">void</span><span class="p">)</span>
<span class="p">{</span>
<span class="w">   </span><span class="n">printargs</span><span class="p">(</span><span class="mi">5</span><span class="p">,</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="mi">14</span><span class="p">,</span><span class="w"> </span><span class="mi">84</span><span class="p">,</span><span class="w"> </span><span class="mi">97</span><span class="p">,</span><span class="w"> </span><span class="mi">15</span><span class="p">,</span><span class="w"> </span><span class="mi">24</span><span class="p">,</span><span class="w"> </span><span class="mi">48</span><span class="p">,</span><span class="w"> </span><span class="mi">-1</span><span class="p">);</span>
<span class="w">   </span><span class="n">printargs</span><span class="p">(</span><span class="mi">84</span><span class="p">,</span><span class="w"> </span><span class="mi">51</span><span class="p">,</span><span class="w"> </span><span class="mi">-1</span><span class="p">);</span>
<span class="w">   </span><span class="n">printargs</span><span class="p">(</span><span class="mi">-1</span><span class="p">);</span>
<span class="w">   </span><span class="n">printargs</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="mi">-1</span><span class="p">);</span>
<span class="w">   </span><span class="k">return</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</pre></div>
<p>這個程式產生輸出:
</p>
<pre>5 2 14 84 97 15 24 48
84 51

1
</pre>
<div class="mw-heading mw-heading2"><h2 id="varargs.h"><code>varargs.h</code></h2></div>
<p><a href="POSIX" class="mw-redirect" title="POSIX">POSIX</a>定義所遺留下的標頭檔<code>varargs.h</code>，它早在C標準化前就已經開始使用了且提供類似<code>stdarg.h</code>的機能。<a href="MSDN" class="mw-redirect" title="MSDN">MSDN</a>明确指出这一头文件已经过时，完全被stdarg.h取代<sup id="cite_ref-2" class="reference"><a href="#cite_note-2"><span class="cite-bracket">[</span>2<span class="cite-bracket">]</span></a></sup>。這個標頭檔不屬於ISO C的一部分。檔案定義在<a href="%E5%8D%95%E4%B8%80UNIX%E8%A7%84%E8%8C%83" class="mw-redirect" title="单一UNIX规范">单一UNIX规范</a>的第二個版本中，簡單的包含所有C89 <code>stdarg.h</code>的機能，除了:不能使用在標準C較新的形式定義；你可以不給予參數(標準C需要最少一個參數)；與標準C運作的方法不同，其中一個寫成：
</p>
<div class="mw-highlight mw-highlight-lang-c mw-content-ltr" dir="ltr"><pre><span></span><span class="cp">#include</span><span class="w"> </span><span class="cpf">&lt;stdarg.h&gt;</span>

<span class="kt">int</span><span class="w"> </span><span class="nf">summate</span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">n</span><span class="p">,</span><span class="w"> </span><span class="p">...)</span>
<span class="p">{</span>
<span class="w">    </span><span class="kt">va_list</span><span class="w"> </span><span class="n">ap</span><span class="p">;</span>
<span class="w">    </span><span class="kt">int</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span>

<span class="w">    </span><span class="n">va_start</span><span class="p">(</span><span class="n">ap</span><span class="p">,</span><span class="w"> </span><span class="n">n</span><span class="p">);</span>
<span class="w">    </span><span class="k">for</span><span class="w"> </span><span class="p">(;</span><span class="w"> </span><span class="n">n</span><span class="p">;</span><span class="w"> </span><span class="n">n</span><span class="o">--</span><span class="p">)</span>
<span class="w">        </span><span class="n">i</span><span class="w"> </span><span class="o">+=</span><span class="w"> </span><span class="n">va_arg</span><span class="p">(</span><span class="n">ap</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="p">);</span>
<span class="w">    </span><span class="n">va_end</span><span class="p">(</span><span class="n">ap</span><span class="p">);</span>
<span class="w">    </span><span class="k">return</span><span class="w"> </span><span class="n">i</span><span class="p">;</span>
<span class="p">}</span>
</pre></div>
<p>或比較舊式的定義:
</p>
<div class="mw-highlight mw-highlight-lang-c mw-content-ltr" dir="ltr"><pre><span></span><span class="cp">#include</span><span class="w"> </span><span class="cpf">&lt;stdarg.h&gt;</span>

<span class="kt">int</span><span class="w"> </span><span class="nf">summate</span><span class="p">(</span><span class="n">n</span><span class="p">,</span><span class="w"> </span><span class="p">...)</span>
<span class="w">    </span><span class="kt">int</span><span class="w"> </span><span class="n">n</span><span class="p">;</span>
<span class="p">{</span>
<span class="w">    </span><span class="cm">/* ... */</span>
<span class="p">}</span>
</pre></div>
<p>以此呼叫
</p>
<div class="mw-highlight mw-highlight-lang-c mw-content-ltr" dir="ltr"><pre><span></span><span class="n">summate</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>
<span class="n">summate</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="mi">2</span><span class="p">);</span>
<span class="n">summate</span><span class="p">(</span><span class="mi">4</span><span class="p">,</span><span class="w"> </span><span class="mi">9</span><span class="p">,</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="mi">3</span><span class="p">,</span><span class="w"> </span><span class="mi">2</span><span class="p">);</span>
</pre></div>
<p><br>
使用<code>varargs.h</code>的函式為:
</p>
<div class="mw-highlight mw-highlight-lang-c mw-content-ltr" dir="ltr"><pre><span></span><span class="cp">#include</span><span class="w"> </span><span class="cpf">&lt;varargs.h&gt;</span>

<span class="n">summate</span><span class="p">(</span><span class="n">n</span><span class="p">,</span><span class="w"> </span><span class="n">va_alist</span><span class="p">)</span>
<span class="w">    </span><span class="n">va_dcl</span><span class="w"> </span><span class="cm">/* 這裡沒有分號! */</span>
<span class="p">{</span>
<span class="w">    </span><span class="kt">va_list</span><span class="w"> </span><span class="n">ap</span><span class="p">;</span>
<span class="w">    </span><span class="kt">int</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span>

<span class="w">    </span><span class="n">va_start</span><span class="p">(</span><span class="n">ap</span><span class="p">);</span>
<span class="w">    </span><span class="k">for</span><span class="w"> </span><span class="p">(;</span><span class="w"> </span><span class="n">n</span><span class="p">;</span><span class="w"> </span><span class="n">n</span><span class="o">--</span><span class="p">)</span>
<span class="w">        </span><span class="n">i</span><span class="w"> </span><span class="o">+=</span><span class="w"> </span><span class="n">va_arg</span><span class="p">(</span><span class="n">ap</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="p">);</span>
<span class="w">    </span><span class="n">va_end</span><span class="p">(</span><span class="n">ap</span><span class="p">);</span>
<span class="w">    </span><span class="k">return</span><span class="w"> </span><span class="n">i</span><span class="p">;</span>
<span class="p">}</span>
</pre></div>
<p>以及相同的呼叫方法。
</p><p><code>varargs.h</code>因為運作的模式需要舊型態的函式定義。<sup id="cite_ref-3" class="reference"><a href="#cite_note-3"><span class="cite-bracket">[</span>3<span class="cite-bracket">]</span></a></sup>
</p>
<div class="mw-heading mw-heading2"><h2 id="參見"><span id=".E5.8F.83.E8.A6.8B"></span>參見</h2></div>
<ul><li><a href="%E5%8F%AF%E8%AE%8A%E5%8F%83%E6%95%B8%E5%87%BD%E6%95%B8" title="可變參數函數">可變參數函數</a></li></ul>
<div class="mw-heading mw-heading2"><h2 id="參考"><span id=".E5.8F.83.E8.80.83"></span>參考</h2></div>
<ol class="references">
<li id="cite_note-1"><span class="mw-cite-backlink"><b><a href="#cite_ref-1">^</a></b></span> <span class="reference-text"><style data-mw-deduplicate="TemplateStyles:r92366446">
/* start https://zh.wikipedia.org/ */


.mw-parser-output cite.citation{font-style:inherit;word-wrap:break-word}.mw-parser-output .citation q{quotes:"\"""\"""'""'"}.mw-parser-output .citation:target{background-color:rgba(0,127,255,0.133)}.mw-parser-output .id-lock-free.id-lock-free a{background:url("./_mw_/Lock-green.svg")right 0.1em center/9px no-repeat}.mw-parser-output .id-lock-limited.id-lock-limited a,.mw-parser-output .id-lock-registration.id-lock-registration a{background:url("./_mw_/Lock-gray-alt-2.svg")right 0.1em center/9px no-repeat}.mw-parser-output .id-lock-subscription.id-lock-subscription a{background:url("./_mw_/Lock-red-alt-2.svg")right 0.1em center/9px no-repeat}.mw-parser-output .cs1-ws-icon a{background:url("./_mw_/Wikisource-logo.svg")right 0.1em center/12px no-repeat}body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .id-lock-free a,body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .id-lock-limited a,body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .id-lock-registration a,body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .id-lock-subscription a,body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .cs1-ws-icon a{background-size:contain;padding:0 1em 0 0}.mw-parser-output .cs1-code{color:inherit;background:inherit;border:none;padding:inherit}.mw-parser-output .cs1-hidden-error{display:none;color:var(--color-error,#d33)}.mw-parser-output .cs1-visible-error{color:var(--color-error,#d33)}.mw-parser-output .cs1-maint{display:none;color:#085;margin-left:0.3em}.mw-parser-output .cs1-kern-left{padding-left:0.2em}.mw-parser-output .cs1-kern-right{padding-right:0.2em}.mw-parser-output .citation .mw-selflink{font-weight:inherit}@media screen{.mw-parser-output .cs1-format{font-size:95%}html.skin-theme-clientpref-night .mw-parser-output .cs1-maint{color:#18911f}}@media screen and (prefers-color-scheme:dark){html.skin-theme-clientpref-os .mw-parser-output .cs1-maint{color:#18911f}}


/* end   https://zh.wikipedia.org/ */
</style><cite class="citation web"><a rel="nofollow" class="external text" href="http://www.opengroup.org/onlinepubs/009695399/basedefs/stdarg.h.html">IEEE Std 1003.1 <code>stdarg.h</code></a>.  <span class="reference-accessdate"> [<span class="nowrap">2009-07-04</span>]</span>. （原始内容<a rel="nofollow" class="external text" href="https://web.archive.org/web/20090411042801/http://www.opengroup.org/onlinepubs/009695399/basedefs/stdarg.h.html">存档</a>于2009-04-11）.</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fzh.wikipedia.org%3AStdarg.h&amp;rft.btitle=IEEE+Std+1003.1+%3Ccode%3Estdarg.h%3C%2Fcode%3E&amp;rft.genre=unknown&amp;rft_id=http%3A%2F%2Fwww.opengroup.org%2Fonlinepubs%2F009695399%2Fbasedefs%2Fstdarg.h.html&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook" class="Z3988"><span style="display:none;">&nbsp;</span></span></span>
</li>
<li id="cite_note-2"><span class="mw-cite-backlink"><b><a href="#cite_ref-2">^</a></b></span> <span class="reference-text"><a rel="nofollow" class="external text" href="http://msdn.microsoft.com/zh-cn/site/kb57fad8%28v=VS.100%29">The macros defined in VARARGS.H are deprecated and exist solely for backwards compatibility. Use the macros defined in STDARGS.H unless you are working with code before the ANSI standard. </a></span>
</li>
<li id="cite_note-3"><span class="mw-cite-backlink"><b><a href="#cite_ref-3">^</a></b></span> <span class="reference-text"><cite class="citation web"><a rel="nofollow" class="external text" href="http://www.opengroup.org/onlinepubs/007908799/xsh/varargs.h.html">單使用者UNIX系統規範(Single UNIX Specification) <code>varargs.h</code></a>.  <span class="reference-accessdate"> [<span class="nowrap">2007-08-01</span>]</span>. （原始内容<a rel="nofollow" class="external text" href="https://web.archive.org/web/20080618153236/http://www.opengroup.org/onlinepubs/007908799/xsh/varargs.h.html">存档</a>于2008-06-18）.</cite><span title="ctx_ver=Z39.88-2004&amp;rfr_id=info%3Asid%2Fzh.wikipedia.org%3AStdarg.h&amp;rft.btitle=%E5%96%AE%E4%BD%BF%E7%94%A8%E8%80%85UNIX%E7%B3%BB%E7%B5%B1%E8%A6%8F%E7%AF%84%28Single+UNIX+Specification%29+%3Ccode%3Evarargs.h%3C%2Fcode%3E&amp;rft.genre=unknown&amp;rft_id=http%3A%2F%2Fwww.opengroup.org%2Fonlinepubs%2F007908799%2Fxsh%2Fvarargs.h.html&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook" class="Z3988"><span style="display:none;">&nbsp;</span></span></span>
</li>
</ol></div><!--htdig_noindex--><div><div class="zim-footer">
    This article is issued from <a class="external text" title="Last edited on 2020-09-27" href="https://zh.wikipedia.org/wiki/?title=Stdarg.h&amp;oldid=61985103">Wikipedia</a>. The text is available under <a class="external text" href="https://creativecommons.org/licenses/by-sa/4.0/deed.zh">Creative Commons Attribution-Share Alike 4.0</a> unless otherwise noted. Additional terms may apply for the media files.
</div>
</div><!--/htdig_noindex--></div>
            </div>
          </main>
        </div>
      </div>
    </div>
     <script src="./_webp_/webpHandler.js"></script>
  

</body></html>