299 lines
33 KiB
HTML
299 lines
33 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="zh" dir="ltr" class="client-nojs" xmlns="http://www.w3.org/1999/xhtml" xml:lang="zh">
|
|
<head><meta http-equiv="x-ua-compatible" content="ie=edge">
|
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
|
<title>函数声明</title>
|
|
<link rel="stylesheet" href="ext.css" />
|
|
<link rel="stylesheet" href="site_modules.css" />
|
|
</head>
|
|
<body class="mediawiki ltr sitedir-ltr ns-0 ns-subject page-c_language_function_declaration skin-cppreference2 action-view cpp-navbar">
|
|
<div id="cpp-content-base">
|
|
<div id="content"><a id="top"></a>
|
|
<h1 id="firstHeading" class="firstHeading">函数声明</h1>
|
|
<div id="bodyContent">
|
|
<div id="contentSub"><span class="subpages">< <a href="c.html">c</a>‎ | <a href="c-language.html">language</a></span></div>
|
|
<div id="mw-content-text" lang="zh" dir="ltr" class="mw-content-ltr" xml:lang="zh">
|
|
<p>函数声明引入指代函数的<a href="c-language-identifier.html">标识符</a>,并可选地指定该函数的参数类型(<i>原型</i>)。函数声明(不同于<a href="c-language-function_definition.html">定义</a>)可以出现于块作用域和文件作用域中。</p>
|
|
<h3><span class="mw-headline" id=".E8.AF.AD.E6.B3.95">语法</span></h3>
|
|
<p>在函数声明的<a href="c-language-declarations.html">声明文法</a>中, <span class="t-spar">类型说明符</span> 序列,可选择地由声明器修饰,指代<i>返回类型</i>(可以是任何异于函数和数组的类型),而 <span class="t-spar">声明符</span> 有三种形式:</p>
|
|
<table class="t-sdsc-begin">
|
|
<tr>
|
|
<td colspan="10" class="t-sdsc-sep"></td>
|
|
</tr>
|
|
<tr class="t-sdsc">
|
|
<td><span class="t-spar">非指针声明符</span> <code><b>(</b></code> <span class="t-spar">形参列表</span> <code><b>)</b></code> <span class="t-spar">属性说明符序列</span><span class="t-mark">(可选)</span></td>
|
|
<td>(1)</td>
|
|
<td class="t-sdsc-nopad"></td>
|
|
</tr>
|
|
<tr>
|
|
<td colspan="10" class="t-sdsc-sep"></td>
|
|
</tr>
|
|
<tr class="t-sdsc">
|
|
<td><span class="t-spar">非指针声明符</span> <code><b>(</b></code> <span class="t-spar">标识符列表</span> <code><b>)</b></code> <span class="t-spar">属性说明符序列</span><span class="t-mark">(可选)</span></td>
|
|
<td>(2)</td>
|
|
<td><span class="t-mark-rev t-until-c23">(C23 前)</span></td>
|
|
</tr>
|
|
<tr>
|
|
<td colspan="10" class="t-sdsc-sep"></td>
|
|
</tr>
|
|
<tr class="t-sdsc">
|
|
<td><span class="t-spar">非指针声明符</span> <code><b>(</b></code> <code><b>)</b></code> <span class="t-spar">属性说明符序列</span><span class="t-mark">(可选)</span></td>
|
|
<td>(3)</td>
|
|
<td class="t-sdsc-nopad"></td>
|
|
</tr>
|
|
<tr>
|
|
<td colspan="10" class="t-sdsc-sep"></td>
|
|
</tr>
|
|
</table>
|
|
<p>其中</p>
|
|
<table class="t-par-begin">
|
|
<tr class="t-par">
|
|
<td><span class="t-spar">非指针声明符</span></td>
|
|
<td>-</td>
|
|
<td>任何无括号指针声明器以外的<a href="c-language-declarations.html#.E5.A3.B0.E6.98.8E.E5.99.A8">声明器</a>。包含于此声明器中的标识符是成为函数指代器的标识符。</td>
|
|
</tr>
|
|
<tr class="t-par">
|
|
<td><span class="t-spar">形参列表</span></td>
|
|
<td>-</td>
|
|
<td>为单一关键词 <span class="t-c"><span class="mw-geshi c source-c"><span class="kw4">void</span></span></span> 或<i>参数</i>的逗号分隔列表,可以以<a href="c-language-variadic.html">省略号参数</a>结尾。</td>
|
|
</tr>
|
|
<tr class="t-par">
|
|
<td><span class="t-spar">标识符列表</span></td>
|
|
<td>-</td>
|
|
<td>标识符的逗号分隔列表,仅在声明器被用作旧式<a href="c-language-function_definition.html">函数定义</a>的一部分的情况下可能</td>
|
|
</tr>
|
|
<tr class="t-par">
|
|
<td><span class="t-spar">属性说明符序列</span></td>
|
|
<td>-</td>
|
|
<td><span class="t-mark-rev t-since-c23">(C23)</span>可选的<a href="c-language-attributes.html">属性</a>列表,应用到函数类型</td>
|
|
</tr>
|
|
</table>
|
|
<div class="t-li1"><span class="t-li">1)</span> 新式 (C89) 函数声明。此声明不仅引入函数指代器自身,而且还为任何将来的<a href="c-language-operator_other.html#.E5.87.BD.E6.95.B0.E8.B0.83.E7.94.A8">函数调用表达式</a>提供函数原型,强制将使用参数表达式转换成声明参数类型,还有编译时的参数数量检查。
|
|
<div dir="ltr" class="mw-geshi" style="text-align: left;">
|
|
<div class="c source-c">
|
|
<pre class="de1"><span class="kw4">int</span> max<span class="br0">(</span><span class="kw4">int</span> a, <span class="kw4">int</span> b<span class="br0">)</span><span class="sy4">;</span> <span class="co1">// 声明</span>
|
|
<span class="kw4">int</span> n <span class="sy1">=</span> max<span class="br0">(</span><span class="nu16">12.01</span>, <span class="nu16">3.14</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// OK :从 double 转换到 int</span></pre></div>
|
|
</div>
|
|
</div>
|
|
<div class="t-li1"><span class="t-li">2)</span> <span class="t-mark-rev t-until-c23">(C23 前)</span> 旧式 (K&R) 函数定义。此声明不引入函数原型,且任何将来的<a href="c-language-operator_other.html#.E5.87.BD.E6.95.B0.E8.B0.83.E7.94.A8">函数调用表达式</a>都将进行默认参数提升,而且若实参数量不匹配形参数量则引起未定义行为。
|
|
<div dir="ltr" class="mw-geshi" style="text-align: left;">
|
|
<div class="c source-c">
|
|
<pre class="de1"><span class="kw4">int</span> max<span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span>
|
|
<span class="kw4">int</span> max<span class="br0">(</span>a, b<span class="br0">)</span>
|
|
<span class="kw4">int</span> a, b<span class="sy4">;</span> <span class="br0">{</span> <span class="kw1">return</span> a<span class="sy1">></span>b<span class="sy4">?</span>a<span class="sy4">:</span>b<span class="sy4">;</span> <span class="br0">}</span> <span class="co1">// 定义期待 int ;第二个调用是未定义行为</span>
|
|
<span class="kw4">int</span> n <span class="sy1">=</span> max<span class="br0">(</span><span class="kw2">true</span>, <span class="br0">(</span><span class="kw4">char</span><span class="br0">)</span><span class="st0">'a'</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// 以二个 int 参数调用 max (提升后)</span>
|
|
<span class="kw4">int</span> n <span class="sy1">=</span> max<span class="br0">(</span><span class="nu17">12.01f</span>, <span class="nu16">3.14</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// 以二个 double 参数调用 max (提升后)</span></pre></div>
|
|
</div>
|
|
</div>
|
|
<div class="t-li1"><span class="t-li">3)</span> 无原型函数声明。此声明不引入原型<span class="t-rev-inl t-since-c23"><span>,除非作为函数定义的一部分,其中它等价于 <span class="t-spar">形参列表</span> <span class="t-c"><span class="mw-geshi c source-c"><span class="kw4">void</span></span></span></span> <span><span class="t-mark-rev t-since-c23">(C23 起)</span></span></span>。</div>
|
|
<h3><span class="mw-headline" id=".E8.A7.A3.E9.87.8A">解释</span></h3>
|
|
<p>函数的返回类型,由 <span class="t-spar">说明符与限定符</span> 中的类型说明符确定,并且像在<a href="c-language-declarations.html">声明</a>中一样可以由 <span class="t-spar">声明符</span> 修改,它必须是非数组对象类型或类型 <span class="t-c"><span class="mw-geshi c source-c"><span class="kw4">void</span></span></span> 。若该函数声明不是定义,则返回类型可以为<a href="c-language-type.html#.E4.B8.8D.E5.AE.8C.E6.95.B4.E7.B1.BB.E5.9E.8B" class="mw-redirect">不完整</a>。返回类型不能有 cvr 限定:为构造函数类型的目的,调整任何有限定返回类型为其无限定版本。</p>
|
|
<div dir="ltr" class="mw-geshi" style="text-align: left;">
|
|
<div class="c source-c">
|
|
<pre class="de1"><span class="kw4">void</span> f<span class="br0">(</span><span class="kw4">char</span> <span class="sy2">*</span>s<span class="br0">)</span><span class="sy4">;</span> <span class="co1">// 返回类型为 void</span>
|
|
<span class="kw4">int</span> sum<span class="br0">(</span><span class="kw4">int</span> a, <span class="kw4">int</span> b<span class="br0">)</span><span class="sy4">;</span> <span class="co1">// sum 的返回类型为 int.</span>
|
|
<span class="kw4">int</span> <span class="br0">(</span><span class="sy2">*</span>foo<span class="br0">(</span><span class="kw4">const</span> <span class="kw4">void</span> <span class="sy2">*</span>p<span class="br0">)</span><span class="br0">)</span><span class="br0">[</span><span class="nu0">3</span><span class="br0">]</span><span class="sy4">;</span> <span class="co1">// 返回类型是指向 3 个 int 的数组的指针</span>
|
|
|
|
<span class="kw4">double</span> <span class="kw4">const</span> bar<span class="br0">(</span><span class="kw4">void</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// 声明 double(void) 类型函数</span>
|
|
<span class="kw4">double</span> <span class="br0">(</span><span class="sy2">*</span>barp<span class="br0">)</span><span class="br0">(</span><span class="kw4">void</span><span class="br0">)</span> <span class="sy1">=</span> bar<span class="sy4">;</span> <span class="co1">// OK : foop 是指向 double(void) 的指针</span>
|
|
<span class="kw4">double</span> <span class="kw4">const</span> <span class="br0">(</span><span class="sy2">*</span>barpc<span class="br0">)</span><span class="br0">(</span><span class="kw4">void</span><span class="br0">)</span> <span class="sy1">=</span> barp<span class="sy4">;</span> <span class="co1">// OK : foopc 亦为指向 double(void) 的指针</span></pre></div>
|
|
</div>
|
|
<p>函数声明器可以与其他声明器联合,只要他们共享其类型说明符和限定符。</p>
|
|
<div dir="ltr" class="mw-geshi" style="text-align: left;">
|
|
<div class="c source-c">
|
|
<pre class="de1"><span class="kw4">int</span> f<span class="br0">(</span><span class="kw4">void</span><span class="br0">)</span>, <span class="sy2">*</span>fip<span class="br0">(</span><span class="br0">)</span>, <span class="br0">(</span><span class="sy2">*</span>pfi<span class="br0">)</span><span class="br0">(</span><span class="br0">)</span>, <span class="sy2">*</span>ap<span class="br0">[</span><span class="nu0">3</span><span class="br0">]</span><span class="sy4">;</span> <span class="co1">// 声明二个函数和二个对象</span>
|
|
<span class="kw1">inline</span> <span class="kw4">int</span> g<span class="br0">(</span><span class="kw4">int</span><span class="br0">)</span>, n<span class="sy4">;</span> <span class="co1">// 错误: inline 说明符仅用于函数</span>
|
|
<span class="kw1">typedef</span> <span class="kw4">int</span> array_t<span class="br0">[</span><span class="nu0">3</span><span class="br0">]</span><span class="sy4">;</span>
|
|
array_t a, h<span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// 错误:数组类型不能作为函数返回类型</span></pre></div>
|
|
</div>
|
|
<p>若函数声明器出现于任何函数外,则其引入的标识符拥有<a href="c-language-scope.html">文件作用域</a>和<a href="c-language-storage_duration.html">外部链接</a>,除非使用 <code>static</code> 或较前的 static 声明可见。若声明出现于另一函数内,则标识符拥有块作用域(且亦拥有外部或内部链接)。</p>
|
|
<div dir="ltr" class="mw-geshi" style="text-align: left;">
|
|
<div class="c source-c">
|
|
<pre class="de1"><span class="kw4">int</span> main<span class="br0">(</span><span class="kw4">void</span><span class="br0">)</span>
|
|
<span class="br0">{</span>
|
|
<span class="kw4">int</span> f<span class="br0">(</span><span class="kw4">int</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// 外部链接,文件作用域</span>
|
|
f<span class="br0">(</span><span class="nu0">1</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// 定义需要程序的某处可用</span>
|
|
<span class="br0">}</span></pre></div>
|
|
</div>
|
|
<p><span class="t-rev-inl t-until-c23"><span>不是<a href="c-language-function_definition.html">函数定义</a>的一部分的声明中,</span> <span><span class="t-mark-rev t-until-c23">(C23 前)</span></span></span>参数不需要命名:</p>
|
|
<div dir="ltr" class="mw-geshi" style="text-align: left;">
|
|
<div class="c source-c">
|
|
<pre class="de1"><span class="kw4">int</span> f<span class="br0">(</span><span class="kw4">int</span>, <span class="kw4">int</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// 声明</span>
|
|
<span class="co1">// int f(int, int) { return 7; } // 错误,参数在定义中必须命名</span>
|
|
<span class="co1">// C23 中允许此定义。</span></pre></div>
|
|
</div>
|
|
<p><span class="t-spar">形参列表</span> 中的每个参数是引入单个变量的<a href="c-language-declarations.html">声明</a>,变量拥有下列额外属性:</p>
|
|
<ul>
|
|
<li>声明器中的标识符是可选的<span class="t-rev-inl t-until-c23"><span>(除非此函数声明是函数定义的一部分)</span> <span><span class="t-mark-rev t-until-c23">(C23 前)</span></span></span></li>
|
|
</ul>
|
|
<div dir="ltr" class="mw-geshi" style="text-align: left;">
|
|
<div class="c source-c">
|
|
<pre class="de1"><span class="kw4">int</span> f<span class="br0">(</span><span class="kw4">int</span>, <span class="kw4">double</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// OK</span>
|
|
<span class="kw4">int</span> g<span class="br0">(</span><span class="kw4">int</span> a, <span class="kw4">double</span> b<span class="br0">)</span><span class="sy4">;</span> <span class="co1">// 也 OK</span>
|
|
<span class="kw4">int</span> f<span class="br0">(</span><span class="kw4">int</span>, <span class="kw4">double</span><span class="br0">)</span> <span class="br0">{</span> <span class="kw1">return</span> <span class="nu0">1</span><span class="sy4">;</span> <span class="br0">}</span> <span class="co1">// 错误:定义必须命名参数</span>
|
|
<span class="co1">// C23 中允许此定义。</span></pre></div>
|
|
</div>
|
|
<ul>
|
|
<li>仅有的得到允许的<a href="c-language-storage_duration.html">存储类说明符</a>是 <code>register</code> ,而在非定义的函数声明中忽略它</li>
|
|
</ul>
|
|
<div dir="ltr" class="mw-geshi" style="text-align: left;">
|
|
<div class="c source-c">
|
|
<pre class="de1"><span class="kw4">int</span> f<span class="br0">(</span><span class="kw4">static</span> <span class="kw4">int</span> x<span class="br0">)</span><span class="sy4">;</span> <span class="co1">// 错误</span>
|
|
<span class="kw4">int</span> f<span class="br0">(</span><span class="kw4">int</span> <span class="br0">[</span><span class="kw4">static</span> <span class="nu0">10</span><span class="br0">]</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// OK (数组下标的 static 不是存储类说明符)</span></pre></div>
|
|
</div>
|
|
<ul>
|
|
<li>任何数组类型的参数都被调整到对应的指针类型<span class="t-rev-inl t-since-c99"><span>,若数组声明器的方括号内有限定符,则它具有限定</span> <span><span class="t-mark-rev t-since-c99">(C99 起)</span></span></span>。</li>
|
|
</ul>
|
|
<div dir="ltr" class="mw-geshi" style="text-align: left;">
|
|
<div class="c source-c">
|
|
<pre class="de1"><span class="kw4">int</span> f<span class="br0">(</span><span class="kw4">int</span><span class="br0">[</span><span class="br0">]</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// 声明 int f(int*)</span>
|
|
<span class="kw4">int</span> g<span class="br0">(</span><span class="kw4">const</span> <span class="kw4">int</span><span class="br0">[</span><span class="nu0">10</span><span class="br0">]</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// 声明 int g(const int*)</span>
|
|
<span class="kw4">int</span> h<span class="br0">(</span><span class="kw4">int</span><span class="br0">[</span><span class="kw4">const</span> <span class="kw4">volatile</span><span class="br0">]</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// 声明 int h(int * const volatile)</span>
|
|
<span class="kw4">int</span> x<span class="br0">(</span><span class="kw4">int</span><span class="br0">[</span><span class="sy2">*</span><span class="br0">]</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// 声明 int x(int*)</span></pre></div>
|
|
</div>
|
|
<ul>
|
|
<li>任何函数类型的参数都被调整到对应的指针类型</li>
|
|
</ul>
|
|
<div dir="ltr" class="mw-geshi" style="text-align: left;">
|
|
<div class="c source-c">
|
|
<pre class="de1"><span class="kw4">int</span> f<span class="br0">(</span><span class="kw4">char</span> g<span class="br0">(</span><span class="kw4">double</span><span class="br0">)</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// 声明 int f(char (*g)(double))</span>
|
|
<span class="kw4">int</span> h<span class="br0">(</span><span class="kw4">int</span><span class="br0">(</span><span class="kw4">void</span><span class="br0">)</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// 声明 int h(int (*)(void))</span></pre></div>
|
|
</div>
|
|
<ul>
|
|
<li>参数列表可以以 <code><b>, ...</b></code> 终止,细节见<a href="c-language-variadic.html">变参数函数</a>。</li>
|
|
</ul>
|
|
<div dir="ltr" class="mw-geshi" style="text-align: left;">
|
|
<div class="c source-c">
|
|
<pre class="de1"><span class="kw4">int</span> f<span class="br0">(</span><span class="kw4">int</span>, ...<span class="br0">)</span><span class="sy4">;</span></pre></div>
|
|
</div>
|
|
<ul>
|
|
<li>参数不能拥有 <span class="t-c"><span class="mw-geshi c source-c"><span class="kw4">void</span></span></span> 类型(但可以拥有指向 void 指针类型)。完全由关键词 <span class="t-c"><span class="mw-geshi c source-c"><span class="kw4">void</span></span></span> 组成的特殊参数列表用于声明不接收参数的函数。</li>
|
|
</ul>
|
|
<div dir="ltr" class="mw-geshi" style="text-align: left;">
|
|
<div class="c source-c">
|
|
<pre class="de1"><span class="kw4">int</span> f<span class="br0">(</span><span class="kw4">void</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// OK</span>
|
|
<span class="kw4">int</span> g<span class="br0">(</span><span class="kw4">void</span> x<span class="br0">)</span><span class="sy4">;</span> <span class="co1">// 错误</span></pre></div>
|
|
</div>
|
|
<ul>
|
|
<li>任何出现于参数列表中,能被当成 typedef 名或参数名的标识符,都会被当做 typedef 名: <span class="t-c"><span class="mw-geshi c source-c"><span class="kw4">int</span> f<span class="br0">(</span><a href="c-types-size_t.html"><span class="kw100">size_t</span></a>, <a href="c-types-integer.html"><span class="kw133">uintptr_t</span></a><span class="br0">)</span></span></span> 被分析成新式声明器,声明一个函数,它接收二个 <code>size_t</code> 和 <code>uintptr_t</code> 类型的未命名参数,而非开始定义接收二个名为“ <code>size_t</code> ”和“ <code>uintptr_t</code> ”的函数的旧式声明器。</li>
|
|
<li>参数列表可以拥有不完整类型<span class="t-rev-inl t-since-c99"><span>而且可以用 VLA 记法 [*]</span> <span><span class="t-mark-rev t-since-c99">(C99 起)</span></span></span>(除了在<a href="c-language-function_definition.html">函数定义</a>中,在数组到指针和函数到指针调整后,参数类型必须完整)</li>
|
|
</ul>
|
|
<table class="t-rev-begin">
|
|
<tr class="t-rev t-since-c23">
|
|
<td>
|
|
<p><a href="c-language-attributes.html">属性说明符序列</a>亦能应用到函数参数。</p>
|
|
</td>
|
|
<td><span class="t-mark-rev t-since-c23">(C23 起)</span></td>
|
|
</tr>
|
|
</table>
|
|
<p>其他函数调用机制上的细节见<a href="c-language-operator_other.html#.E5.87.BD.E6.95.B0.E8.B0.83.E7.94.A8">函数调用运算符</a>,关于从函数返回,见 <a href="c-language-return.html"><code>return</code></a> 。</p>
|
|
<h3><span class="mw-headline" id=".E6.B3.A8.E8.A7.A3">注解</span></h3>
|
|
<p>不同于 C++ <span class="t-rev-inl t-since-c23"><span>与函数定义</span> <span><span class="t-mark-rev t-since-c23">(C23 起)</span></span></span>,声明器 <span class="t-c"><span class="mw-geshi c source-c">f<span class="br0">(</span><span class="br0">)</span></span></span> 与 <span class="t-c"><span class="mw-geshi c source-c">f<span class="br0">(</span><span class="kw4">void</span><span class="br0">)</span></span></span> 拥有不同含义:声明符 <span class="t-c"><span class="mw-geshi c source-c">f<span class="br0">(</span><span class="kw4">void</span><span class="br0">)</span></span></span> 是新式(原型)声明符,声明函数不接收参数。声明符 <span class="t-c"><span class="mw-geshi c source-c">f<span class="br0">(</span><span class="br0">)</span></span></span> 是声明函数接收<i>未指定</i>数量的参数的声明符(除非用于函数定义)</p>
|
|
<div dir="ltr" class="mw-geshi" style="text-align: left;">
|
|
<div class="c source-c">
|
|
<pre class="de1"><span class="kw4">int</span> f<span class="br0">(</span><span class="kw4">void</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// 声明:不接收参数</span>
|
|
<span class="kw4">int</span> g<span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// 声明:接收未知参数</span>
|
|
|
|
<span class="kw4">int</span> main<span class="br0">(</span><span class="kw4">void</span><span class="br0">)</span> <span class="br0">{</span>
|
|
f<span class="br0">(</span><span class="nu0">1</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// 编译时错误</span>
|
|
g<span class="br0">(</span><span class="nu0">2</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// 未定义行为</span>
|
|
<span class="br0">}</span>
|
|
|
|
<span class="kw4">int</span> f<span class="br0">(</span><span class="kw4">void</span><span class="br0">)</span> <span class="br0">{</span> <span class="kw1">return</span> <span class="nu0">1</span><span class="sy4">;</span> <span class="br0">)</span> <span class="co1">// 实际定义</span>
|
|
<span class="kw4">int</span> g<span class="br0">(</span>a,b,c,d<span class="br0">)</span> <span class="kw4">int</span> a,b,c,d<span class="sy4">;</span> <span class="br0">{</span> <span class="kw1">return</span> <span class="nu0">2</span><span class="sy4">;</span> <span class="br0">}</span> <span class="co1">// 实际定义</span></pre></div>
|
|
</div>
|
|
<p>和在<a href="c-language-function_definition.html">函数定义</a>中不同,形参列表可以从 typedef 继承</p>
|
|
<div dir="ltr" class="mw-geshi" style="text-align: left;">
|
|
<div class="c source-c">
|
|
<pre class="de1"><span class="kw1">typedef</span> <span class="kw4">int</span> p<span class="br0">(</span><span class="kw4">int</span> q, <span class="kw4">int</span> r<span class="br0">)</span><span class="sy4">;</span> <span class="co1">// p 是函数类型 int(int, int)</span>
|
|
p f<span class="sy4">;</span> <span class="co1">// 声明 int f(int, int)</span></pre></div>
|
|
</div>
|
|
<table class="t-rev-begin">
|
|
<tr class="t-rev t-until-c99">
|
|
<td>
|
|
<p>C89 中, <span class="t-spar">说明符与限定符</span> 是可选的,且若省略它,则函数的返回类型默认为 <span class="t-c"><span class="mw-geshi c source-c"><span class="kw4">int</span></span></span> (可以由 <span class="t-spar">声明符</span> 修改)。</p>
|
|
<div dir="ltr" class="mw-geshi" style="text-align: left;">
|
|
<div class="c source-c">
|
|
<pre class="de1"><span class="sy2">*</span>f<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span> <span class="co1">// 返回 int* 的函数</span>
|
|
<span class="kw1">return</span> <a href="c-types-NULL.html"><span class="kw103">NULL</span></a><span class="sy4">;</span>
|
|
<span class="br0">}</span></pre></div>
|
|
</div>
|
|
</td>
|
|
<td><span class="t-mark-rev t-until-c99">(C99 前)</span></td>
|
|
</tr>
|
|
</table>
|
|
<h3><span class="mw-headline" id=".E7.BC.BA.E9.99.B7.E6.8A.A5.E5.91.8A">缺陷报告</span></h3>
|
|
<p>下列更改行为的缺陷报告追溯地应用于以前出版的 C 标准。</p>
|
|
<table class="dsctable" style="font-size:0.8em">
|
|
<tr>
|
|
<th>DR</th>
|
|
<th>应用于</th>
|
|
<th>出版时的行为</th>
|
|
<th>正确行为</th>
|
|
</tr>
|
|
<tr>
|
|
<td><a rel="nofollow" class="external text" href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2396.htm#dr_423">DR 423</a></td>
|
|
<td>C89</td>
|
|
<td>返回类型可以有限定</td>
|
|
<td>返回类型被隐式除去限定</td>
|
|
</tr>
|
|
</table>
|
|
<h3><span class="mw-headline" id=".E5.BC.95.E7.94.A8">引用</span></h3>
|
|
<div class="t-ref-std-17">
|
|
<ul>
|
|
<li>C17 标准(ISO/IEC 9899:2018):</li>
|
|
</ul>
|
|
<dl>
|
|
<dd>
|
|
<ul>
|
|
<li>6.7.6.3 Function declarators (including prototypes) (p: 96-98)</li>
|
|
</ul>
|
|
</dd>
|
|
</dl>
|
|
<div class="t-ref-std-11">
|
|
<ul>
|
|
<li>C11 标准(ISO/IEC 9899:2011):</li>
|
|
</ul>
|
|
<dl>
|
|
<dd>
|
|
<ul>
|
|
<li>6.7.6.3 Function declarators (including prototypes) (p: 133-136)</li>
|
|
</ul>
|
|
</dd>
|
|
</dl>
|
|
<div class="t-ref-std-c99">
|
|
<ul>
|
|
<li>C99 标准(ISO/IEC 9899:1999):</li>
|
|
</ul>
|
|
<dl>
|
|
<dd>
|
|
<ul>
|
|
<li>6.7.5.3 Function declarators (including prototypes) (p: 118-121)</li>
|
|
</ul>
|
|
</dd>
|
|
</dl>
|
|
<div class="t-ref-std-c89">
|
|
<ul>
|
|
<li>C89/C90 标准(ISO/IEC 9899:1990):</li>
|
|
</ul>
|
|
<dl>
|
|
<dd>
|
|
<ul>
|
|
<li>3.5.4.3 Function declarators (including prototypes)</li>
|
|
</ul>
|
|
</dd>
|
|
</dl>
|
|
</div>
|
|
<h3><span class="mw-headline" id=".E5.8F.82.E9.98.85">参阅</span></h3>
|
|
<table class="t-dsc-begin"></table>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="visualClear"></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</body>
|
|
</html>
|