346 lines
33 KiB
HTML
346 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_declarations 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><i>声明</i>是一个引入一个或多个<a href="c-language-identifier.html">标识符</a>到程序中,并指定其含义及属性的 C 语言构造。</p>
|
|
<p>声明可以出现在任何作用域中。每个声明以分号结束(类似<a href="c-language-statements.html">语句</a>),并由<span class="t-rev-inl t-until-c23"><span>两</span> <span><span class="t-mark-rev t-until-c23">(C23 前)</span></span></span><span class="t-rev-inl t-since-c23"><span>三</span> <span><span class="t-mark-rev t-since-c23">(C23 起)</span></span></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> <span class="t-spar">声明符与初始化器</span><span class="t-mark">(可选)</span> <code><b>;</b></code></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> <span class="t-spar">说明符与限定符</span> <span class="t-spar">声明符与初始化器</span> <code><b>;</b></code></td>
|
|
<td>(2)</td>
|
|
<td><span class="t-mark-rev t-since-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></td>
|
|
<td>(3)</td>
|
|
<td><span class="t-mark-rev t-since-c23">(C23 起)</span></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>任意顺序的下列内容的空白符分隔列表
|
|
<ul>
|
|
<li>类型说明符:</li>
|
|
</ul>
|
|
<dl>
|
|
<dd>
|
|
<ul>
|
|
<li><span class="t-c"><span class="mw-geshi c source-c"><span class="kw4">void</span></span></span></li>
|
|
<li><a href="c-language-arithmetic_types.html">算术类型</a>名</li>
|
|
<li><a href="c-language-atomic.html">原子类型</a>名</li>
|
|
<li>先前由 <a href="c-language-typedef.html">typedef</a> 声明引入的名称</li>
|
|
<li><a href="c-language-struct.html"><code>struct</code></a> 、 <a href="c-language-union.html"><code>union</code></a> 或 <a href="c-language-enum.html"><code>enum</code></a> 说明符</li>
|
|
</ul>
|
|
</dd>
|
|
</dl>
|
|
<ul>
|
|
<li>零或一个存储类说明符: <a href="c-language-typedef.html"><code>typedef</code></a>、 <a href="c-language-storage_duration.html"><code>auto</code>、 <code>register</code>、 <code>static</code>、 <code>extern</code>、 <code>_Thread_local</code></a></li>
|
|
<li>零或多个类型限定符: <a href="c-language-const.html"><code>const</code></a> 、 <a href="c-language-volatile.html"><code>volatile</code></a>、 <a href="c-language-restrict.html"><code>restrict</code></a>、 <a href="c-language-atomic.html">_Atomic</a></li>
|
|
<li>(只在声明函数时)零或多个函数说明符: <a href="c-language-inline.html"><code>inline</code></a> 、 <a href="c-language-_Noreturn.html"><code>_Noreturn</code></a></li>
|
|
<li>零或多个对齐说明符: <a href="c-language-_Alignas.html"><code>_Alignas</code></a></li>
|
|
</ul>
|
|
</td>
|
|
</tr>
|
|
<tr class="t-par">
|
|
<td><span class="t-spar">声明符与初始化器</span></td>
|
|
<td>-</td>
|
|
<td><span class="t-spar">声明符</span> 的逗号分隔列表(每个声明符提供附加类型信息及/或要声明的标识符)。声明符可伴随<a href="c-language-initialization.html">初始化器</a>。 <a href="c-language-enum.html">enum</a> 、 <a href="c-language-struct.html">struct</a> 和 <a href="c-language-union.html">union</a> 声明可忽略 <span class="t-spar">声明符</span> ,这种情况下它们仅引入枚举常量和/或标签。</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-2)</span> 简单声明。引入一或多个标识符,它们代表对象、函数、结构体/联合体/枚举标签、 typedef 或枚举常量。</div>
|
|
<div class="t-li1"><span class="t-li">3)</span> 属性声明。不声明任何标识符,并且若标准不指定含义则拥有实现定义的含义。</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> a, <span class="sy2">*</span>b<span class="sy1">=</span><a href="c-types-NULL.html"><span class="kw103">NULL</span></a><span class="sy4">;</span> <span class="co1">// “ int ”是类型说明符,</span>
|
|
<span class="co1">// “ a ”是声明符</span>
|
|
<span class="co1">// “ *b ”是声明符而 NULL 是初始化器</span>
|
|
<span class="kw4">const</span> <span class="kw4">int</span> <span class="sy2">*</span>f<span class="br0">(</span><span class="kw4">void</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// “ int ”是类型说明符</span>
|
|
<span class="co1">// “ const ”是类型限定符</span>
|
|
<span class="co1">// “ *f(void) ”是声明符</span>
|
|
<span class="kw2">enum</span> COLOR <span class="br0">{</span>RED, GREEN, BLUE<span class="br0">}</span> c<span class="sy4">;</span> <span class="co1">// “ enum COLOR {RED, GREEN, BLUE} ”是类型说明符</span>
|
|
<span class="co1">// “ c ”是声明符</span></pre></div>
|
|
</div>
|
|
<p>一个声明引入的每个标识符类型是通过 <span class="t-spar">类型说明符</span> 所指定的类型及其 <span class="t-spar">声明符</span> 所应用的类型修饰决定的。</p>
|
|
<p><a href="c-language-attributes.html">属性</a><span class="t-mark-rev t-since-c23">(C23 起)</span>可在 <span class="t-spar">说明符与限定符</span> 中出现,该情况下它们应用到前导的说明符所确定的类型。</p>
|
|
<h3><span class="mw-headline" id=".E5.A3.B0.E6.98.8E.E7.AC.A6">声明符</span></h3>
|
|
<p>每个声明符是下列之一:</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> <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><code><b>(</b></code> <span class="t-spar">声明符</span> <code><b>)</b></code></td>
|
|
<td>(2)</td>
|
|
<td class="t-sdsc-nopad"></td>
|
|
</tr>
|
|
<tr>
|
|
<td colspan="10" class="t-sdsc-sep"></td>
|
|
</tr>
|
|
<tr class="t-sdsc">
|
|
<td><code><b>*</b></code> <span class="t-spar">属性说明符序列</span><span class="t-mark">(可选)</span> <span class="t-spar">限定符</span><span class="t-mark">(可选)</span> <span class="t-spar">声明符</span></td>
|
|
<td>(3)</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> <code><b>static</b></code><span class="t-mark">(可选)</span> <span class="t-spar">限定符</span><span class="t-mark">(可选)</span> <span class="t-spar">表达式</span> <code><b>]</b></code>
|
|
<p><span class="t-spar">无指针声明符</span> <code><b>[</b></code> <span class="t-spar">限定符</span><span class="t-mark">(可选)</span> <code><b>*</b></code> <code><b>]</b></code></p>
|
|
</td>
|
|
<td>(4)</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></td>
|
|
<td>(5)</td>
|
|
<td class="t-sdsc-nopad"></td>
|
|
</tr>
|
|
<tr>
|
|
<td colspan="10" class="t-sdsc-sep"></td>
|
|
</tr>
|
|
</table>
|
|
<div class="t-li1"><span class="t-li">1)</span> 此声明符引入的标识符。</div>
|
|
<div class="t-li1"><span class="t-li">2)</span> 任何可以放入括号中的声明符;引入指向数组或指向函数指针时要求这么做。</div>
|
|
<div class="t-li1"><span class="t-li">3)</span> <a href="c-language-pointer.html">指针声明符</a>:声明 <span class="t-c"><span class="mw-geshi c source-c">S <span class="sy2">*</span> cvr D</span></span> 声明 <code>D</code> 为 <span class="t-spar">cvr</span> 限定指针,指向 <code>S</code> 所确定的类型。</div>
|
|
<div class="t-li1"><span class="t-li">4)</span> <a href="c-language-array.html">数组声明符</a>:声明 <span class="t-c"><span class="mw-geshi c source-c">S D<span class="br0">[</span>N<span class="br0">]</span></span></span> 声明 <code>D</code> 为有 <code>N</code> 个 <code>S</code> 所确定类型对象的数组。 <span class="t-spar">无指针声明符</span> 是无括号指针声明符以外的其他任何声明符。</div>
|
|
<div class="t-li1"><span class="t-li">5)</span> <a href="c-language-function_declaration.html">函数声明符</a>:声明 <span class="t-c"><span class="mw-geshi c source-c">S D<span class="br0">(</span>params<span class="br0">)</span></span></span> 声明 <code>D</code> 为接收参数 <code>params</code> 并返回 <code>S</code> 的函数。 <span class="t-spar">无指针声明符</span> 是无括号指针声明符以外的其他任何声明符。</div>
|
|
<p>此语法背后的原因,是当声明符所声明的标识符以与声明符相同的形式出现在表达式中时,它会拥有类型说明符序列所指定的类型。</p>
|
|
<div dir="ltr" class="mw-geshi" style="text-align: left;">
|
|
<div class="c source-c">
|
|
<pre class="de1"><span class="kw1">struct</span> C <span class="br0">{</span>
|
|
<span class="kw4">int</span> member<span class="sy4">;</span> <span class="co1">// “ int ”是类型说明符</span>
|
|
<span class="co1">// “ member ”是声明符</span>
|
|
<span class="br0">}</span> obj, <span class="sy2">*</span>pObj <span class="sy1">=</span> <span class="sy3">&</span>obj<span class="sy4">;</span>
|
|
<span class="co1">// “ struct C { int member; } ”是类型说明符</span>
|
|
<span class="co1">// 声明符“ obj ”定义 struct C 类型的对象</span>
|
|
<span class="co1">// 声明符“ *pObj ”声明指向 struct C 的指针,</span>
|
|
<span class="co1">// 初始化器“ = &obj ”提供该指针的初值</span>
|
|
|
|
<span class="kw4">int</span> a <span class="sy1">=</span> <span class="nu0">1</span>, <span class="sy2">*</span>p <span class="sy1">=</span> <a href="c-types-NULL.html"><span class="kw103">NULL</span></a>, f<span class="br0">(</span><span class="kw4">void</span><span class="br0">)</span>, <span class="br0">(</span><span class="sy2">*</span>pf<span class="br0">)</span><span class="br0">(</span><span class="kw4">double</span><span class="br0">)</span><span class="sy4">;</span>
|
|
<span class="co1">// 类型说明符是“ int ”</span>
|
|
<span class="co1">// 声明符“ a ”定义一个 int 类型对象</span>
|
|
<span class="co1">// 初始化器“=1”提供其初值</span>
|
|
<span class="co1">// 声明符“ *p ”定义一个指向 int 指针类型的对象</span>
|
|
<span class="co1">// 初始化器“ =NULL ”提供其初值</span>
|
|
<span class="co1">// 声明符“ f(void) ”声明接受 void 并返回 int 的函数</span>
|
|
<span class="co1">// 声明符“ (*pf)(double) ”定义一个指向</span>
|
|
<span class="co1">// 接受 double 并返回 int 的函数的指针类型对象</span>
|
|
|
|
<span class="kw4">int</span> <span class="br0">(</span><span class="sy2">*</span><span class="br0">(</span><span class="sy2">*</span>foo<span class="br0">)</span><span class="br0">(</span><span class="kw4">double</span><span class="br0">)</span><span class="br0">)</span><span class="br0">[</span><span class="nu0">3</span><span class="br0">]</span> <span class="sy1">=</span> <a href="c-types-NULL.html"><span class="kw103">NULL</span></a><span class="sy4">;</span>
|
|
<span class="co1">// 类型说明符是“int”</span>
|
|
<span class="co1">// 1. 声明符“ (*(*foo)(double))[3] ”是数组声明符:</span>
|
|
<span class="co1">// 所声明类型是“ 3 个 int 的数组的 /嵌套声明符/ ”</span>
|
|
<span class="co1">// 2. 嵌套声明符是“ *(*foo)(double)) ”,是指针声明符</span>
|
|
<span class="co1">// 所声明类型是“ /嵌套声明符/ 指向 3 个 int 的数组的指针”</span>
|
|
<span class="co1">// 3. 嵌套声明符是“ (*foo)(double) ”,是一个函数声明符</span>
|
|
<span class="co1">// 所声明类型是“ /嵌套声明符/ 接受 double 并返回指向 3 个 int 的数组的指针的函数”</span>
|
|
<span class="co1">// 4. 嵌套声明符是“ (*foo) ”,是一个(有括号,函数声明符所要求)指针声明符。</span>
|
|
<span class="co1">// 所声明类型是“ /嵌套声明符/ 指向接受 double 并返回指向 3 个 int 的数组的指针的函数的指针”</span>
|
|
<span class="co1">// 5. 嵌套声明符是“ foo ”,是一个标识符。</span>
|
|
<span class="co1">// 该声明引入一个标识符“ foo ”,以指代一个对象,其类型为</span>
|
|
<span class="co1">// “指向接受 double 并返回指向 3 个 int 的数组的指针的函数的指针”</span>
|
|
<span class="co1">// 初始化器“ = NULL ”提供此指针的初值。</span>
|
|
|
|
<span class="co1">// 若在用于声明符形式的表达式使用“foo”,则表达式类型将是int。</span>
|
|
<span class="kw4">int</span> x <span class="sy1">=</span> <span class="br0">(</span><span class="sy2">*</span><span class="br0">(</span><span class="sy2">*</span>foo<span class="br0">)</span><span class="br0">(</span><span class="nu16">1.2</span><span class="br0">)</span><span class="br0">)</span><span class="br0">[</span><span class="nu0">0</span><span class="br0">]</span><span class="sy4">;</span></pre></div>
|
|
</div>
|
|
<p>每个不属于其他声明符一部分的声明符结尾是一个<a href="c-language-eval_order.html">顺序点</a>。</p>
|
|
<p>所有情况下, <span class="t-spar">属性说明符序列</span> 均为可选的<a href="c-language-attributes.html">属性</a><span class="t-mark-rev t-since-c23">(C23 起)</span>序列。立即出现在标识符后时,它应用到被声明的对象或函数。</p>
|
|
<h3><span class="mw-headline" id=".E5.AE.9A.E4.B9.89">定义</span></h3>
|
|
<p><i>定义</i>是一个提供所有关于其所声明标识符信息的声明。</p>
|
|
<p>每个 <a href="c-language-enum.html">enum</a> 或 <a href="c-language-typedef.html">typedef</a> 声明都是定义。</p>
|
|
<p>对于函数,包含函数体的声明即是<a href="c-language-function_definition.html">函数定义</a>:</p>
|
|
<div dir="ltr" class="mw-geshi" style="text-align: left;">
|
|
<div class="c source-c">
|
|
<pre class="de1"><span class="kw4">int</span> foo<span class="br0">(</span><span class="kw4">double</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// 声明</span>
|
|
<span class="kw4">int</span> foo<span class="br0">(</span><span class="kw4">double</span> x<span class="br0">)</span><span class="br0">{</span> <span class="kw1">return</span> x<span class="sy4">;</span> <span class="br0">}</span> <span class="co1">// 定义</span></pre></div>
|
|
</div>
|
|
<p>对于对象,分配其存储的声明(<a href="c-language-storage_duration.html">自动或静态</a>,但、非 extern )即是定义,而一个不分配存储的声明(<a href="c-language-extern.html">外部声明</a>)不是。</p>
|
|
<div dir="ltr" class="mw-geshi" style="text-align: left;">
|
|
<div class="c source-c">
|
|
<pre class="de1"><span class="kw2">extern</span> <span class="kw4">int</span> n<span class="sy4">;</span> <span class="co1">// 声明</span>
|
|
<span class="kw4">int</span> n <span class="sy1">=</span> <span class="nu0">10</span><span class="sy4">;</span> <span class="co1">// 定义</span></pre></div>
|
|
</div>
|
|
<p>对于<a href="c-language-struct.html">结构体</a>和<a href="c-language-union.html">联合体</a>,指定其成员列表的声明是定义:</p>
|
|
<div dir="ltr" class="mw-geshi" style="text-align: left;">
|
|
<div class="c source-c">
|
|
<pre class="de1"><span class="kw1">struct</span> X<span class="sy4">;</span> <span class="co1">// 声明</span>
|
|
<span class="kw1">struct</span> X <span class="br0">{</span> <span class="kw4">int</span> n<span class="sy4">;</span> <span class="br0">}</span><span class="sy4">;</span> <span class="co1">// 定义</span></pre></div>
|
|
</div>
|
|
<h3><span class="mw-headline" id=".E9.87.8D.E5.A3.B0.E6.98.8E">重声明</span></h3>
|
|
<p>若另一个同一标识符的声明在同一<a href="c-language-scope.html">作用域</a>的较早部分出现,则声明不可再引入同一标识符,除非</p>
|
|
<ul>
|
|
<li><a href="c-language-storage_duration.html">有链接</a>对象(外部或内部)的声明可以重复:</li>
|
|
</ul>
|
|
<div dir="ltr" class="mw-geshi" style="text-align: left;">
|
|
<div class="c source-c">
|
|
<pre class="de1"><span class="kw2">extern</span> <span class="kw4">int</span> x<span class="sy4">;</span>
|
|
<span class="kw4">int</span> x <span class="sy1">=</span> <span class="nu0">10</span><span class="sy4">;</span> <span class="co1">// OK</span>
|
|
<span class="kw2">extern</span> <span class="kw4">int</span> x<span class="sy4">;</span> <span class="co1">// OK</span>
|
|
|
|
<span class="kw4">static</span> <span class="kw4">int</span> n<span class="sy4">;</span>
|
|
<span class="kw4">static</span> <span class="kw4">int</span> n <span class="sy1">=</span> <span class="nu0">10</span><span class="sy4">;</span> <span class="co1">// OK</span>
|
|
<span class="kw4">static</span> <span class="kw4">int</span> n<span class="sy4">;</span> <span class="co1">// OK</span></pre></div>
|
|
</div>
|
|
<ul>
|
|
<li>非 VLA <a href="c-language-typedef.html">typedef</a> 可以任意重复,只要它指名同一类型:</li>
|
|
</ul>
|
|
<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> int_t<span class="sy4">;</span>
|
|
<span class="kw1">typedef</span> <span class="kw4">int</span> int_t<span class="sy4">;</span> <span class="co1">// OK</span></pre></div>
|
|
</div>
|
|
<ul>
|
|
<li><a href="c-language-struct.html">struct</a> 和 <a href="c-language-union.html">union</a> 声明可以重复:</li>
|
|
</ul>
|
|
<div dir="ltr" class="mw-geshi" style="text-align: left;">
|
|
<div class="c source-c">
|
|
<pre class="de1"><span class="kw1">struct</span> X<span class="sy4">;</span>
|
|
<span class="kw1">struct</span> X <span class="br0">{</span> <span class="kw4">int</span> n<span class="sy4">;</span> <span class="br0">}</span><span class="sy4">;</span>
|
|
<span class="kw1">struct</span> X<span class="sy4">;</span></pre></div>
|
|
</div>
|
|
<p>这些规则会简化头文件的使用。</p>
|
|
<h3><span class="mw-headline" id=".E6.B3.A8.E8.A7.A3">注解</span></h3>
|
|
<table class="t-rev-begin">
|
|
<tr class="t-rev t-until-c99">
|
|
<td>
|
|
<p>C89 中,任何<a href="c-language-statements.html#.E5.A4.8D.E5.90.88.E8.AF.AD.E5.8F.A5">复合语句</a>(块作用域)中的声明必须出现在块的开头,在任何<a href="c-language-statements.html">语句</a>之前。</p>
|
|
<p>而且,C89 中返回 <span class="t-c"><span class="mw-geshi c source-c"><span class="kw4">int</span></span></span> 的函数可以隐式地用<a href="c-language-operator_other.html#.E5.87.BD.E6.95.B0.E8.B0.83.E7.94.A8">函数调用运算符</a>声明,且使用旧式<a href="c-language-function_definition.html">函数定义</a>时, <span class="t-c"><span class="mw-geshi c source-c"><span class="kw4">int</span></span></span> 类型的函数参数不必声明。</p>
|
|
</td>
|
|
<td><span class="t-mark-rev t-until-c99">(C99 前)</span></td>
|
|
</tr>
|
|
</table>
|
|
<p>禁止空声明符;简单声明必须拥有至少一个声明符,或声明至少一个 struct/union/enum 标签,或引入至少一个枚举常量。</p>
|
|
<table class="t-rev-begin">
|
|
<tr class="t-rev t-since-c99">
|
|
<td>
|
|
<p>若声明符的任一部分是<a href="c-language-array.html">非常量长度数组</a>( VLA )声明符,则整个声明符的类型被称作“可变修改类型”。根据可变修改类型定义的类型同样是可变修改的( VM )。</p>
|
|
<p>任何可变修改类型声明只允许出现在<a href="c-language-scope.html">块作用域</a>或函数原型作用域,而且不能是任何结构体或联合体的成员。尽管 VLA 只能拥有自动或分配<a href="c-language-storage_duration.html">存储期</a>,一个 VM 类型,例如指向 VLA 的指针也可以有静态存储。关于 VM 类型有其他使用限制,见 <a href="c-language-goto.html">goto</a>、 <a href="c-language-switch.html">switch</a>、 <span class="t-lc"><a href="c-program-longjmp.html">longjmp</a></span> 。</p>
|
|
</td>
|
|
<td><span class="t-mark-rev t-since-c99">(C99 起)</span></td>
|
|
</tr>
|
|
</table>
|
|
<table class="t-rev-begin">
|
|
<tr class="t-rev t-since-c11">
|
|
<td>
|
|
<p><a href="c-language-_Static_assert.html">_Static_assert</a> 从 C 文法的视角来看,被认为是声明(故它们可以出现在任何声明能出现的地方),但它们不会引入任何新的标识符,且不遵循声明语法。</p>
|
|
</td>
|
|
<td><span class="t-mark-rev t-since-c11">(C11 起)</span></td>
|
|
</tr>
|
|
</table>
|
|
<table class="t-rev-begin">
|
|
<tr class="t-rev t-since-c23">
|
|
<td>
|
|
<p><a href="c-language-attributes.html">属性</a>声明亦被认为是声明(故它们可以出现在任何声明能出现的地方),但它们不会引入任何新的标识符。单个无 <span class="t-spar">属性说明符序列</span> 的 <code><b>;</b></code> 不是属性声明,而是语句。</p>
|
|
</td>
|
|
<td><span class="t-mark-rev t-since-c23">(C23 起)</span></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 Declarations (p: 78-105)</li>
|
|
</ul>
|
|
</dd>
|
|
</dl>
|
|
</div>
|
|
<div class="t-ref-std-11">
|
|
<ul>
|
|
<li>C11 标准(ISO/IEC 9899:2011):</li>
|
|
</ul>
|
|
<dl>
|
|
<dd>
|
|
<ul>
|
|
<li>6.7 Declarations (p: 108-145)</li>
|
|
</ul>
|
|
</dd>
|
|
</dl>
|
|
</div>
|
|
<div class="t-ref-std-c99">
|
|
<ul>
|
|
<li>C99 标准(ISO/IEC 9899:1999):</li>
|
|
</ul>
|
|
<dl>
|
|
<dd>
|
|
<ul>
|
|
<li>6.7 Declarations (p: 97-130)</li>
|
|
</ul>
|
|
</dd>
|
|
</dl>
|
|
</div>
|
|
<div class="t-ref-std-c89">
|
|
<ul>
|
|
<li>C89/C90 标准(ISO/IEC 9899:1990):</li>
|
|
</ul>
|
|
<dl>
|
|
<dd>
|
|
<ul>
|
|
<li>3.5 Declarations</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 class="visualClear"></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</body>
|
|
</html>
|