<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh">
	<id>https://arolstar52-zhtest.hf.space/index.php?action=history&amp;feed=atom&amp;title=Stdarg.h</id>
	<title>Stdarg.h - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="https://arolstar52-zhtest.hf.space/index.php?action=history&amp;feed=atom&amp;title=Stdarg.h"/>
	<link rel="alternate" type="text/html" href="https://arolstar52-zhtest.hf.space/index.php?title=Stdarg.h&amp;action=history"/>
	<updated>2026-07-15T00:32:22Z</updated>
	<subtitle>在这个wiki上该页的修订历史</subtitle>
	<generator>MediaWiki 1.43.9</generator>
	<entry>
		<id>https://arolstar52-zhtest.hf.space/index.php?title=Stdarg.h&amp;diff=569161&amp;oldid=prev</id>
		<title>imported&gt;InternetArchiveBot：​补救2个来源，并将0个来源标记为失效。) #IABot (v2.0.7</title>
		<link rel="alternate" type="text/html" href="https://arolstar52-zhtest.hf.space/index.php?title=Stdarg.h&amp;diff=569161&amp;oldid=prev"/>
		<updated>2020-09-27T02:49:12Z</updated>

		<summary type="html">&lt;p&gt;补救2个来源，并将0个来源标记为失效。) #IABot (v2.0.7&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{noteTA&lt;br /&gt;
|G1=IT&lt;br /&gt;
|1=zh-hans:函数;zh-hant:函式;&lt;br /&gt;
|2=zh-hans:返回;zh-hant:回傳;&lt;br /&gt;
|3=zh-hans:数据类型;zh-hant:型態;&lt;br /&gt;
|4=zh-hans:声明;zh-hant:宣告;&lt;br /&gt;
|5=zh-hans:变量;zh-hant:變數;&lt;br /&gt;
|6=zh-hans:调用;zh-hant:呼叫;&lt;br /&gt;
}}&lt;br /&gt;
{{lowercase}}&lt;br /&gt;
&lt;br /&gt;
{{C_Standard_library}}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;lt;code&amp;gt;stdarg.h&amp;lt;/code&amp;gt;&amp;#039;&amp;#039;&amp;#039;是[[C語言]]中[[C標準函式庫]]的[[標頭檔]]，stdarg是由&amp;#039;&amp;#039;&amp;#039;st&amp;#039;&amp;#039;&amp;#039;andar&amp;#039;&amp;#039;&amp;#039;d&amp;#039;&amp;#039;&amp;#039;（標準） &amp;#039;&amp;#039;&amp;#039;arg&amp;#039;&amp;#039;&amp;#039;uments（參數）簡化而來，主要目的為讓函式能夠接收不定量參數。&amp;lt;ref&amp;gt;{{cite web | url=http://www.opengroup.org/onlinepubs/009695399/basedefs/stdarg.h.html | title=IEEE Std 1003.1 &amp;lt;code&amp;gt;stdarg.h&amp;lt;/code&amp;gt; | accessdate=2009-07-04 | archive-date=2009-04-11 | archive-url=https://web.archive.org/web/20090411042801/http://www.opengroup.org/onlinepubs/009695399/basedefs/stdarg.h.html | dead-url=no }}&amp;lt;/ref&amp;gt; [[C++]]的&amp;lt;code&amp;gt;cstdarg&amp;lt;/code&amp;gt;標頭檔中也提供這樣的機能；雖然與C的標頭檔是相容的，但是也有衝突存在。&lt;br /&gt;
&lt;br /&gt;
[[不定參數函式]]（Variadic functions）是&amp;lt;code&amp;gt;stdarg.h&amp;lt;/code&amp;gt;內容典型的應用，雖然也可以使用在其他由不定參數函式呼叫的函式（例如，&amp;lt;code&amp;gt;[[vprintf]]&amp;lt;/code&amp;gt;）。&lt;br /&gt;
&lt;br /&gt;
== 宣告不定參數函式 ==&lt;br /&gt;
&lt;br /&gt;
不定參數函式的參數數量是可變動的，它使用[[省略號]]來忽略之後的參數。例如&amp;lt;code&amp;gt;[[printf]]&amp;lt;/code&amp;gt;函式一般。代表性的宣告為:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
int check(int a, double b, ...);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
不定參數函式最少要有一個命名的參數，所以&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
char *wrong(...);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在C是不被允許的。在C，省略符號之前必須要有逗號；在C++，則沒有這種強制要求。&lt;br /&gt;
（雖然在C++中，這樣的宣告是合理的，但是這種寫法，因為沒有已命名的參數，使得&amp;lt;code&amp;gt;va_start&amp;lt;/code&amp;gt;沒辦法抓到動態參數的正確起始點。）&lt;br /&gt;
&lt;br /&gt;
== 定義不定參數函式 ==&lt;br /&gt;
&lt;br /&gt;
使用與聲明時相同的語法來定義:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=c&amp;gt;&lt;br /&gt;
long func(char, double, int, ...);&lt;br /&gt;
&lt;br /&gt;
long func(char a, double b, int c, ...)&lt;br /&gt;
{&lt;br /&gt;
    /* ... */&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在舊形式中可能會出現較省略的函式定義:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=c&amp;gt;&lt;br /&gt;
long func();&lt;br /&gt;
&lt;br /&gt;
long func(a, b, c, ...)&lt;br /&gt;
    char a;&lt;br /&gt;
    double b;&lt;br /&gt;
{&lt;br /&gt;
    /* ... */&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;stdarg.h&amp;lt;/code&amp;gt;数据类型 ==&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 名稱 !! 描述 !! 相容&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;va_list&amp;lt;/code&amp;gt; || 用來保存宏va_arg与宏va_end所需信息 || [[C89 (C version)|C89]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;stdarg.h&amp;lt;/code&amp;gt;巨集 ==&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 名稱 !! 描述 !! 相容&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;va_start&amp;lt;/code&amp;gt; || 使&amp;lt;code&amp;gt;va_list&amp;lt;/code&amp;gt;指向起始的參數 || C89&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;va_arg&amp;lt;/code&amp;gt; || 檢索參數 || C89&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;va_end&amp;lt;/code&amp;gt; || 釋放&amp;lt;code&amp;gt;va_list&amp;lt;/code&amp;gt; || C89&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;va_copy&amp;lt;/code&amp;gt; || 拷貝&amp;lt;code&amp;gt;va_list&amp;lt;/code&amp;gt;的內容 || [[C99]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 存取參數 ==&lt;br /&gt;
&lt;br /&gt;
存取未命名的參數，首先必須在不定參數函式中宣告&amp;lt;code&amp;gt;va_list&amp;lt;/code&amp;gt;型態的變數。呼叫&amp;lt;code&amp;gt;va_start&amp;lt;/code&amp;gt;並傳入兩個參數：第一個參數為&amp;lt;code&amp;gt;va_list&amp;lt;/code&amp;gt;型態的變數，第二個参数為函式的動態參數前面最後一個已命名的參數名稱，接著每一呼叫&amp;lt;code&amp;gt;va_arg&amp;lt;/code&amp;gt;就會回傳下一個參數，&amp;lt;code&amp;gt;va_arg&amp;lt;/code&amp;gt;的第一個參數為&amp;lt;code&amp;gt;va_list&amp;lt;/code&amp;gt;，第二個參數為回傳的型態。最後&amp;lt;code&amp;gt;va_end&amp;lt;/code&amp;gt;必須在函式回傳前被&amp;lt;code&amp;gt;va_list&amp;lt;/code&amp;gt;呼叫(當作參數)。(沒有要求要讀取完所有參數)&lt;br /&gt;
&lt;br /&gt;
[[C99]]提供額外的巨集，&amp;lt;code&amp;gt;va_copy&amp;lt;/code&amp;gt;，它能夠複製&amp;lt;code&amp;gt;va_list&amp;lt;/code&amp;gt;。而&amp;lt;code&amp;gt;va_copy(va2, va1)&amp;lt;/code&amp;gt;意思為拷貝&amp;lt;code&amp;gt;va1&amp;lt;/code&amp;gt;到&amp;lt;code&amp;gt;va2&amp;lt;/code&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
沒有機制定義該怎麼判別傳遞到函式的參數量或者型態。函式通常需要知道或確定它們變化的方法。共通的慣例包含:&lt;br /&gt;
* 使用&amp;lt;code&amp;gt;[[printf]]&amp;lt;/code&amp;gt;或&amp;lt;code&amp;gt;[[scanf]]&amp;lt;/code&amp;gt;類的格式化字串來嵌入明確指定的型態。&lt;br /&gt;
* 在不定參數最後的[[標记值]](sentinel value)。&lt;br /&gt;
* 總數變數來指明不定參數的數量。&lt;br /&gt;
&lt;br /&gt;
== 型別安全性 ==&lt;br /&gt;
&lt;br /&gt;
有些C的实现，提供了对不定参数的扩展，允許編譯器檢查適當的格式化字串及標志(sentinels)的使用。如果沒有這种擴充，編譯器通常無從檢查傳入函式的未命名參數是否為所預期的型態，也不能转换它们为所需要的数据类型。因此，必須小心謹慎以确保正確性，因为不匹配的型態降到导致[[未定義行為]](Undefined behavior)。例如，如果傳递[[空指针]]，不能仅仅写入&amp;lt;code&amp;gt;NULL&amp;lt;/code&amp;gt;（可能实际定义为0），还要转化为（cast）适当的指针类型。另一个考慮是未命名参数的默认的类型提升。&amp;lt;code&amp;gt;float&amp;lt;/code&amp;gt;將會自動的被轉換成&amp;lt;code&amp;gt;double&amp;lt;/code&amp;gt;‧同樣的比&amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt;(整數)更小容量的參數型態將會被轉換成&amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt;或者&amp;lt;code&amp;gt;unsigned int&amp;lt;/code&amp;gt;‧函式所接收到的未命名參數必須預期将被型態提升。&lt;br /&gt;
&lt;br /&gt;
== 例子 ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=c&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdarg.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void printargs(int arg1, ...) /* 輸出所有int型態的參數，直到-1結束 */&lt;br /&gt;
{&lt;br /&gt;
  va_list ap;&lt;br /&gt;
  int i;&lt;br /&gt;
&lt;br /&gt;
  va_start(ap, arg1); &lt;br /&gt;
  for (i = arg1; i != -1; i = va_arg(ap, int))&lt;br /&gt;
    printf(&amp;quot;%d &amp;quot;, i);&lt;br /&gt;
  va_end(ap);&lt;br /&gt;
  putchar(&amp;#039;\n&amp;#039;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
   printargs(5, 2, 14, 84, 97, 15, 24, 48, -1);&lt;br /&gt;
   printargs(84, 51, -1);&lt;br /&gt;
   printargs(-1);&lt;br /&gt;
   printargs(1, -1);&lt;br /&gt;
   return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
這個程式產生輸出:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
5 2 14 84 97 15 24 48&lt;br /&gt;
84 51&lt;br /&gt;
&lt;br /&gt;
1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;varargs.h&amp;lt;/code&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
[[POSIX]]定義所遺留下的標頭檔&amp;lt;code&amp;gt;varargs.h&amp;lt;/code&amp;gt;，它早在C標準化前就已經開始使用了且提供類似&amp;lt;code&amp;gt;stdarg.h&amp;lt;/code&amp;gt;的機能。[[MSDN]]明确指出这一头文件已经过时，完全被stdarg.h取代&amp;lt;ref&amp;gt;[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. ]&amp;lt;/ref&amp;gt;。這個標頭檔不屬於ISO C的一部分。檔案定義在[[单一UNIX规范]]的第二個版本中，簡單的包含所有C89 &amp;lt;code&amp;gt;stdarg.h&amp;lt;/code&amp;gt;的機能，除了:不能使用在標準C較新的形式定義；你可以不給予參數(標準C需要最少一個參數)；與標準C運作的方法不同，其中一個寫成：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdarg.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int summate(int n, ...)&lt;br /&gt;
{&lt;br /&gt;
    va_list ap;&lt;br /&gt;
    int i = 0;&lt;br /&gt;
&lt;br /&gt;
    va_start(ap, n);&lt;br /&gt;
    for (; n; n--)&lt;br /&gt;
        i += va_arg(ap, int);&lt;br /&gt;
    va_end(ap);&lt;br /&gt;
    return i;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
或比較舊式的定義:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdarg.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int summate(n, ...)&lt;br /&gt;
    int n;&lt;br /&gt;
{&lt;br /&gt;
    /* ... */&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以此呼叫&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
summate(0);&lt;br /&gt;
summate(1, 2);&lt;br /&gt;
summate(4, 9, 2, 3, 2);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
使用&amp;lt;code&amp;gt;varargs.h&amp;lt;/code&amp;gt;的函式為:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;varargs.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
summate(n, va_alist)&lt;br /&gt;
    va_dcl /* 這裡沒有分號! */&lt;br /&gt;
{&lt;br /&gt;
    va_list ap;&lt;br /&gt;
    int i = 0;&lt;br /&gt;
&lt;br /&gt;
    va_start(ap);&lt;br /&gt;
    for (; n; n--)&lt;br /&gt;
        i += va_arg(ap, int);&lt;br /&gt;
    va_end(ap);&lt;br /&gt;
    return i;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
以及相同的呼叫方法。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;varargs.h&amp;lt;/code&amp;gt;因為運作的模式需要舊型態的函式定義。&amp;lt;ref&amp;gt;{{cite web | url=http://www.opengroup.org/onlinepubs/007908799/xsh/varargs.h.html | title=單使用者UNIX系統規範(Single UNIX Specification) &amp;lt;code&amp;gt;varargs.h&amp;lt;/code&amp;gt; | accessdate=2007-08-01 | archive-date=2008-06-18 | archive-url=https://web.archive.org/web/20080618153236/http://www.opengroup.org/onlinepubs/007908799/xsh/varargs.h.html | dead-url=no }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 參見 ==&lt;br /&gt;
&lt;br /&gt;
*[[可變參數函數]]&lt;br /&gt;
&lt;br /&gt;
== 參考 ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:C标准库头文件]]&lt;/div&gt;</summary>
		<author><name>imported&gt;InternetArchiveBot</name></author>
	</entry>
</feed>