40.html

来自「linux 0.11中文版 有注释」· HTML 代码 · 共 64 行

HTML
64
字号
<html>
<head>
<title>include/stdarg.h</title>
<meta name='robots' content='noindex,nofollow'>
<meta name='generator' content='GLOBAL-5.4.1'>
</head>
<body text='#191970' bgcolor='#f5f5dc' vlink='gray'>
<a name='TOP'><h2><a href='../mains.html'>root</a>/<a href='../files/99.html'>include</a>/stdarg.h</h2>
<i><font color='green'>/* [&lt;][&gt;][^][v][top]<a href='#BOTTOM'>[bottom]</a><a href='../mains.html'>[index]</a><a href='../help.html'>[help]</a> */</font></i>
<hr>
<h2><a href='../J/40.html' title='Multiple included from 5 places.'>INCLUDED FROM</a></h2>
<hr>
<pre>
<a name='L1'><font color='darkred'>#ifndef</font> <a href='../S/40.html#L2' title='Defined at 2 in include/stdarg.h.'>_STDARG_H</a>
<a name='L2'><font color='darkred'>#define</font> <a href='../S/40.html#L1' title='Refered from 1 in include/stdarg.h.'>_STDARG_H</a>
<a name='L3'>
<a name='L4'><b>typedef</b> <b>char</b> *<a href='../R/724.html' title='Multiple refered from 4 places.'>va_list</a>;          <i><font color='green'>// 定义va_list 是一个字符指针类型。</font></i>
<a name='L5'>
<a name='L6'><i><font color='green'>/* Amount of space required in an argument list for an arg of type TYPE.</font></i>
<a name='L7'><i><font color='green'>TYPE may alternatively be an expression whose type is used. */</font></i>
<a name='L8'><i><font color='green'>/* 下面给出了类型为TYPE 的arg 参数列表所要求的空间容量。</font></i>
<a name='L9'><i><font color='green'>TYPE 也可以是使用该类型的一个表达式 */</font></i>
<a name='L10'>
<a name='L11'><i><font color='green'>// 下面这句定义了取整后的TYPE 类型的字节长度值。是int 长度(4)的倍数。</font></i>
<a name='L12'><font color='darkred'>#define</font> <a href='../R/368.html' title='Multiple refered from 4 places.'>__va_rounded_size</a>(TYPE) \
<a name='L13'>(((<b>sizeof</b> (<a href='../S/55.html#L73' title='Defined at 73 in kernel/blk_drv/floppy.c.'>TYPE</a>) + <b>sizeof</b> (<b>int</b>) - 1) / <b>sizeof</b> (<b>int</b>)) * <b>sizeof</b> (<b>int</b>))
<a name='L14'>
<a name='L15'><i><font color='green'>// 下面这个函数(用宏实现)使AP 指向传给函数的可变参数表的第一个参数。</font></i>
<a name='L16'><i><font color='green'>// 在第一次调用va_arg 或va_end 之前,必须首先调用该函数。</font></i>
<a name='L17'><i><font color='green'>// 17 行上的__builtin_saveregs()是在gcc 的库程序libgcc2.c 中定义的,用于保存寄存器。</font></i>
<a name='L18'><i><font color='green'>// 它的说明可参见gcc 手册章节“Target Description Macros”中的</font></i>
<a name='L19'><i><font color='green'>// “Implementing the Varargs Macros”小节。</font></i>
<a name='L20'><font color='darkred'>#ifndef</font> __sparc__
<a name='L21'><font color='darkred'>#define</font> <a href='../R/725.html' title='Multiple refered from 4 places.'>va_start</a>(AP, LASTARG) \
<a name='L22'>(AP = ((<b>char</b> *) &amp;(LASTARG) + <a href='../S/40.html#L12' title='Defined at 12 in include/stdarg.h.'>__va_rounded_size</a> (LASTARG)))
<a name='L23'><font color='darkred'>#else</font>
<a name='L24'><font color='darkred'>#define</font> <a href='../R/725.html' title='Multiple refered from 4 places.'>va_start</a>(AP, LASTARG) \
<a name='L25'>(__builtin_saveregs (), \
<a name='L26'>AP = ((<b>char</b> *) &amp;(LASTARG) + <a href='../S/40.html#L12' title='Defined at 12 in include/stdarg.h.'>__va_rounded_size</a> (LASTARG)))
<a name='L27'><font color='darkred'>#endif</font>
<a name='L28'>
<a name='L29'><i><font color='green'>// 下面该宏用于被调用函数完成一次正常返回。va_end 可以修改AP 使其在重新调用</font></i>
<a name='L30'><i><font color='green'>// va_start 之前不能被使用。va_end 必须在va_arg 读完所有的参数后再被调用。</font></i>
<a name='L31'><b>void</b> <a href='../S/40.html#L32' title='Defined at 32 in include/stdarg.h.'>va_end</a> (va_list);          <i><font color='green'>/* Defined in gnulib */</font></i><i><font color='green'>/* 在gnulib 中定义 */</font></i>
<a name='L32'><font color='darkred'>#define</font> <a href='../R/723.html' title='Multiple refered from 4 places.'>va_end</a>(AP)
<a name='L33'>
<a name='L34'><i><font color='green'>// 下面该宏用于扩展表达式使其与下一个被传递参数具有相同的类型和值。</font></i>
<a name='L35'><i><font color='green'>// 对于缺省值,va_arg 可以用字符、无符号字符和浮点类型。</font></i>
<a name='L36'><i><font color='green'>// 在第一次使用va_arg 时,它返回表中的第一个参数,后续的每次调用都将返回表中的</font></i>
<a name='L37'><i><font color='green'>// 下一个参数。这是通过先访问AP,然后把它增加以指向下一项来实现的。</font></i>
<a name='L38'><i><font color='green'>// va_arg 使用TYPE 来完成访问和定位下一项,每调用一次va_arg,它就修改AP 以指示</font></i>
<a name='L39'><i><font color='green'>// 表中的下一参数。</font></i>
<a name='L40'><font color='darkred'>#define</font> <a href='../R/722.html' title='Multiple refered from 11 places.'>va_arg</a>(AP, TYPE) \
<a name='L41'>(AP += <a href='../S/40.html#L12' title='Defined at 12 in include/stdarg.h.'>__va_rounded_size</a> (<a href='../S/55.html#L73' title='Defined at 73 in kernel/blk_drv/floppy.c.'>TYPE</a>), \
<a name='L42'>*((<a href='../S/55.html#L73' title='Defined at 73 in kernel/blk_drv/floppy.c.'>TYPE</a> *) (AP - <a href='../S/40.html#L12' title='Defined at 12 in include/stdarg.h.'>__va_rounded_size</a> (<a href='../S/55.html#L73' title='Defined at 73 in kernel/blk_drv/floppy.c.'>TYPE</a>))))
<a name='L43'>
<a name='L44'><font color='darkred'>#endif</font> <i><font color='green'>/* _STDARG_H */</font></i>
</pre>
<hr>
<a name='BOTTOM'>
<i><font color='green'>/* [&lt;][&gt;][^][v]<a href='#TOP'>[top]</a>[bottom]<a href='../mains.html'>[index]</a><a href='../help.html'>[help]</a> */</font></i>
</body>
</html>

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?