454 lines
32 KiB
HTML
454 lines
32 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_preprocessor_replace 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-preprocessor.html">preprocessor</a></span></div>
|
|
<div id="mw-content-text" lang="zh" dir="ltr" class="mw-content-ltr" xml:lang="zh">
|
|
<p>预处理器支持文本宏替换及类函数文本宏替换。</p>
|
|
<h3><span class="mw-headline" id=".E8.AF.AD.E6.B3.95">语法</span></h3>
|
|
<table class="t-sdsc-begin">
|
|
<tr>
|
|
<td colspan="10" class="t-sdsc-sep"></td>
|
|
</tr>
|
|
<tr class="t-sdsc">
|
|
<td><code><b>#define</b></code> <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>#define</b></code> <span class="t-spar">标识符</span><code><b>(</b></code> <span class="t-spar">形参</span> <code><b>)</b></code> <span class="t-spar">替换列表</span></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>#define</b></code> <span class="t-spar">标识符</span><code><b>(</b></code> <span class="t-spar">形参</span><code><b>, ... )</b></code> <span class="t-spar">替换列表</span></td>
|
|
<td>(3)</td>
|
|
<td><span class="t-mark-rev t-since-c99">(C99 起)</span></td>
|
|
</tr>
|
|
<tr>
|
|
<td colspan="10" class="t-sdsc-sep"></td>
|
|
</tr>
|
|
<tr class="t-sdsc">
|
|
<td><code><b>#define</b></code> <span class="t-spar">标识符</span><code><b>( ... )</b></code> <span class="t-spar">替换列表</span></td>
|
|
<td>(4)</td>
|
|
<td><span class="t-mark-rev t-since-c99">(C99 起)</span></td>
|
|
</tr>
|
|
<tr>
|
|
<td colspan="10" class="t-sdsc-sep"></td>
|
|
</tr>
|
|
<tr class="t-sdsc">
|
|
<td><code><b>#undef</b></code> <span class="t-spar">标识符</span></td>
|
|
<td>(5)</td>
|
|
<td class="t-sdsc-nopad"></td>
|
|
</tr>
|
|
<tr>
|
|
<td colspan="10" class="t-sdsc-sep"></td>
|
|
</tr>
|
|
</table>
|
|
<h3><span class="mw-headline" id=".E8.A7.A3.E9.87.8A">解释</span></h3>
|
|
<h4><span class="mw-headline" id=".23define_.E6.8C.87.E4.BB.A4"><code>#define</code> 指令</span></h4>
|
|
<p><code>#define</code> 指令定义 <span class="t-spar">标识符</span> 为宏,即它们指示编译器将所有 <span class="t-spar">标识符</span> 的后继出现替换为 <span class="t-spar">替换列表</span> ,可以可选地附加地处理。若已定义该标识符为任何类型的宏,则程序为病式,除非定义相同。</p>
|
|
<h5><span class="mw-headline" id=".E4.BB.BF.E5.AF.B9.E8.B1.A1.E5.AE.8F">仿对象宏</span></h5>
|
|
<p>仿对象宏将所定义的 <span class="t-spar">标识符</span> 的每次出现替换为 <span class="t-spar">替换列表</span> 。 <code>#define</code> 指令的版本 (1) 准确地如此表现。</p>
|
|
<h5><span class="mw-headline" id=".E4.BB.BF.E5.87.BD.E6.95.B0.E5.AE.8F">仿函数宏</span></h5>
|
|
<p>仿函数宏将所定义的 <span class="t-spar">标识符</span> 的每次出现替换为 <span class="t-spar">替换列表</span> ,额外地接受数个参数,它们会替换 <span class="t-spar">替换列表</span> 中任何 <span class="t-spar">形参</span> 的对应出现。</p>
|
|
<p>仿函数宏的调用语法与函数调用语法相似:每个宏名实例后跟一个作为下个预处理记号的 ( ,引入被 <span class="t-spar">替换列表</span> 所替换的记号序列,序列由匹配的 ) 记号终止,跳过中间已匹配的左右括号对。</p>
|
|
<p>实参数量必须与宏定义中( <span class="t-spar">形参</span> )的实参数量相同,否则程序为病式。若标识符不在函数记号中,即它自身不后随括号,则决不替换它。</p>
|
|
<p><code>#define</code> 指令的版本 (2) 定义简单的仿函数宏。</p>
|
|
<p><code>#define</code> 指令的版本 (3) 定义有可变数量实参的仿函数宏。能用 <code>__VA_ARGS__</code> 标识符访问额外实参,然后该标识符被实参替换。</p>
|
|
<p><code>#define</code> 指令的版本 (4) 定义有可变数量实参的仿函数宏,但没有常规参数。只能用 <code>__VA_ARGS__</code> 标识符访问实参,然后该标识符被实参替换。</p>
|
|
<p>注意:若仿函数宏的实参包含逗号,且未为匹配的左右括号对所保护(例如 <span class="t-c"><span class="mw-geshi c source-c">macro<span class="br0">(</span>array<span class="br0">[</span>x <span class="sy1">=</span> y, x <span class="sy2">+</span> <span class="nu0">1</span><span class="br0">]</span><span class="br0">)</span></span></span> 或 <span class="t-c"><span class="mw-geshi c source-c"><a href="c-atomic-atomic_store.html"><span class="kw937">atomic_store</span></a> <span class="br0">(</span>p, <span class="br0">(</span><span class="kw1">struct</span> S<span class="br0">)</span><span class="br0">{</span> a, b <span class="br0">}</span><span class="br0">)</span><span class="sy4">;</span></span></span> ),则将逗号转译为宏实参分隔符,这导致编译失败,原因为实参数量不合。</p>
|
|
<h4><span class="mw-headline" id=".23_.E4.B8.8E_.23.23_.E8.BF.90.E7.AE.97.E7.AC.A6"><code>#</code> 与 <code>##</code> 运算符</span></h4>
|
|
<p>在仿函数宏中, <span class="t-spar">替换列表</span> 中标识符前的 <code>#</code> 运算符对标识符做形参替换,并将结果环绕在引号中,等效地创建一个字符串字面量。而且,预处理器会添加反斜杠,以转义环绕内嵌字符串字面量的引号,若存在,并按需在字符串中双写反斜杠。它移除所有前导和尾随空白符,且将任何文本中部的空白符序列(但非内嵌字符串字面量中的)缩减成单个空格。此运算被称作“字符串化”。若字符串化的结果不是合法字符串字面量,则行为未定义。</p>
|
|
<table class="t-rev-begin">
|
|
<tr class="t-rev t-since-c99">
|
|
<td>
|
|
<p><code>#</code> 出现在 <code>__VA_ARGS__</code> 前时,将整个展开的 __VA_ARGS__ 放入引号:</p>
|
|
<div dir="ltr" class="mw-geshi" style="text-align: left;">
|
|
<div class="c source-c">
|
|
<pre class="de1"><span class="co2">#define showlist(...) puts(#__VA_ARGS__)</span>
|
|
showlist<span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// 展开成 puts("")</span>
|
|
showlist<span class="br0">(</span><span class="nu0">1</span>, <span class="st0">"x"</span>, <span class="kw4">int</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// 展开成 puts("1, \"x\", int")</span></pre></div>
|
|
</div>
|
|
</td>
|
|
<td><span class="t-mark-rev t-since-c99">(C99 起)</span></td>
|
|
</tr>
|
|
</table>
|
|
<p><span class="t-spar">替换列表</span> 中任意二个相继标识符间的 <code>##</code> 运算符对二个标识符进行参数替换,然后连接结果。此运算被称作“连接”或“记号粘贴”。只可以粘贴有一同组成合法记号的记号:组成较长标识符的标识符、组成数字的数位或组成 <code>+=</code> 的运算符 <code>+</code> 与 <code>=</code> 。不能通过粘贴 <code>/</code> 与 <code>*</code> 创建注释,因为注释被认为在宏替换前移除。若连接的结果不是合法记号,则行为未定义。</p>
|
|
<p>注意:一些编译器提供允许 ## 出现在逗号后和 __VA_ARGS__ 前的扩展,在此情况下 ## 在 __VA_ARGS__ 非空时无效,但在 __VA_ARGS__ 为空时移除逗号:这使得可以定义如 <code>fprintf (stderr, format, ##__VA_ARGS__)</code> 的宏。</p>
|
|
<h4><span class="mw-headline" id=".23undef_.E6.8C.87.E4.BB.A4"><code>#undef</code> 指令</span></h4>
|
|
<p><code>#undef</code> 指令解除定义 <span class="t-spar">标识符</span> ,即它取消先前 <code>#define</code> 对 <span class="t-spar">标识符</span> 的定义。若标识符无与之关联的宏,则忽略此指令。</p>
|
|
<h3><span class="mw-headline" id=".E9.A2.84.E5.AE.9A.E4.B9.89.E5.AE.8F">预定义宏</span></h3>
|
|
<p>下列宏名称预定义于任意翻译单元中:</p>
|
|
<table class="t-dsc-begin">
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><span class="t-lines"><span>__STDC__</span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>展开成整数常量 <span class="t-c"><span class="mw-geshi c source-c"><span class="nu0">1</span></span></span> 。 此宏是用以指示一致实现的<br />
|
|
<span class="t-mark">(宏常量)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><span class="t-lines"><span>__STDC_VERSION__</span></span></div>
|
|
<div><span class="t-lines"><span><span class="t-mark-rev t-since-c95">(C95)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>展开成 <span class="t-c"><span class="mw-geshi c source-c"><span class="kw4">long</span></span></span> 类型的整数常量,其值随着 C 标准的每个版本递增:
|
|
<ul>
|
|
<li><span class="t-c"><span class="mw-geshi c source-c"><span class="nu0">199409L</span></span></span> <span class="t-mark-rev t-since-c95">(C95)</span></li>
|
|
<li><span class="t-c"><span class="mw-geshi c source-c"><span class="nu0">199901L</span></span></span> <span class="t-mark-rev t-since-c99">(C99)</span></li>
|
|
<li><span class="t-c"><span class="mw-geshi c source-c"><span class="nu0">201112L</span></span></span> <span class="t-mark-rev t-since-c11">(C11)</span></li>
|
|
<li><span class="t-c"><span class="mw-geshi c source-c"><span class="nu0">201710L</span></span></span> <span class="t-mark-rev t-since-c17">(C17)</span><br />
|
|
<span class="t-mark">(宏常量)</span></li>
|
|
</ul>
|
|
</td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><span class="t-lines"><span>__STDC_HOSTED__</span></span></div>
|
|
<div><span class="t-lines"><span><span class="t-mark-rev t-since-c99">(C99)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>若实现有宿主(在操作系统下运行),则展开成整数常量 <span class="t-c"><span class="mw-geshi c source-c"><span class="nu0">1</span></span></span> ,若为独立的(不在操作系统中运行)则展开成 <span class="t-c"><span class="mw-geshi c source-c">​<span class="nu0">0</span>​</span></span><br />
|
|
<span class="t-mark">(宏常量)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><span class="t-lines"><span>__FILE__</span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>展开成当前文件名,为字符串字面量,可用 <a href="c-preprocessor-line.html"><code>#line</code></a> 指令更改<br />
|
|
<span class="t-mark">(宏常量)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><span class="t-lines"><span>__LINE__</span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>展开成源文件行号,为整数常量,可用 <a href="c-preprocessor-line.html"><code>#line</code></a> 指令更改<br />
|
|
<span class="t-mark">(宏常量)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><span class="t-lines"><span>__DATE__</span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>展开成翻译的日期,格式为 "Mmm dd yyyy" 的字符串字面量。月份名如同以 <span class="t-lc"><a href="c-chrono-asctime.html">asctime</a></span> 生成,而若月之日期小于 10 则 "dd" 的首字符为空格<br />
|
|
<span class="t-mark">(宏常量)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><span class="t-lines"><span>__TIME__</span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>展开成翻译的时间,格式为 "hh:mm:ss" 的字符串字面量,如同 <span class="t-c"><span class="mw-geshi c source-c"><a href="c-chrono-asctime.html"><span class="kw515">asctime</span></a><span class="br0">(</span><span class="br0">)</span></span></span> 所生成<br />
|
|
<span class="t-mark">(宏常量)</span></td>
|
|
</tr>
|
|
</table>
|
|
<p>实现可能预定义下列额外宏名:</p>
|
|
<table class="t-dsc-begin">
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><span class="t-lines"><span>__STDC_ISO_10646__</span></span></div>
|
|
<div><span class="t-lines"><span><span class="t-mark-rev t-since-c99">(C99)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>若 <span class="t-c"><span class="mw-geshi c source-c"><span class="kw4">wchar_t</span></span></span> 使用 Unicode ,则展开成形式为 <code>yyyymmL</code> 的整数常量,日期指示受支持的 Unicode 最近版本<br />
|
|
<span class="t-mark">(宏常量)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><span class="t-lines"><span>__STDC_IEC_559__</span></span></div>
|
|
<div><span class="t-lines"><span><span class="t-mark-rev t-since-c99">(C99)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>若支持 IEC 60559 则展开成 <span class="t-c"><span class="mw-geshi c source-c"><span class="nu0">1</span></span></span> <span class="t-rev-inl t-since-c23"><span><span class="t-mark">(弃用)</span></span> <span><span class="t-mark-rev t-since-c23">(C23 起)</span></span></span><br />
|
|
<span class="t-mark">(宏常量)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><span class="t-lines"><span>__STDC_IEC_559_COMPLEX__</span></span></div>
|
|
<div><span class="t-lines"><span><span class="t-mark-rev t-since-c99">(C99)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>若支持 IEC 60559 复数算术则展开成 <span class="t-c"><span class="mw-geshi c source-c"><span class="nu0">1</span></span></span> <span class="t-rev-inl t-since-c23"><span><span class="t-mark">(弃用)</span></span> <span><span class="t-mark-rev t-since-c23">(C23 起)</span></span></span><br />
|
|
<span class="t-mark">(宏常量)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><span class="t-lines"><span>__STDC_UTF_16__</span></span></div>
|
|
<div><span class="t-lines"><span><span class="t-mark-rev t-since-c11">(C11)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>若 <span class="t-c"><span class="mw-geshi c source-c">char16_t</span></span> 使用 UTF-16 则展开成 <span class="t-c"><span class="mw-geshi c source-c"><span class="nu0">1</span></span></span><br />
|
|
<span class="t-mark">(宏常量)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><span class="t-lines"><span>__STDC_UTF_32__</span></span></div>
|
|
<div><span class="t-lines"><span><span class="t-mark-rev t-since-c11">(C11)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>若 <span class="t-c"><span class="mw-geshi c source-c">char32_t</span></span> 使用 UTF-32 则展开成 <span class="t-c"><span class="mw-geshi c source-c"><span class="nu0">1</span></span></span><br />
|
|
<span class="t-mark">(宏常量)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><span class="t-lines"><span>__STDC_MB_MIGHT_NEQ_WC__</span></span></div>
|
|
<div><span class="t-lines"><span><span class="t-mark-rev t-since-c99">(C99)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>若 <span class="t-c"><span class="mw-geshi c source-c"><span class="st0">'x'</span> <span class="sy1">==</span> L<span class="st0">'x'</span></span></span> 可能对基础字符集的成员为 false 则展开成 <span class="t-c"><span class="mw-geshi c source-c"><span class="nu0">1</span></span></span> ,例如在基于 EBCDIC 的, <span class="t-c"><span class="mw-geshi c source-c"><span class="kw4">wchar_t</span></span></span> 使用 Unicode 的系统上<br />
|
|
<span class="t-mark">(宏常量)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><span class="t-lines"><span>__STDC_ANALYZABLE__</span></span></div>
|
|
<div><span class="t-lines"><span><span class="t-mark-rev t-since-c11">(C11)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>若支持<a href="c-language-analyzability.html">可分析性</a>则展开成 <span class="t-c"><span class="mw-geshi c source-c"><span class="nu0">1</span></span></span><br />
|
|
<span class="t-mark">(宏常量)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><span class="t-lines"><span>__STDC_LIB_EXT1__</span></span></div>
|
|
<div><span class="t-lines"><span><span class="t-mark-rev t-since-c11">(C11)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>若支持<a href="c-error.html">边界检查接口</a>则展开成整数常量 <span class="t-c"><span class="mw-geshi c source-c"><span class="nu0">201112L</span></span></span><br />
|
|
<span class="t-mark">(宏常量)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><span class="t-lines"><span>__STDC_NO_ATOMICS__</span></span></div>
|
|
<div><span class="t-lines"><span><span class="t-mark-rev t-since-c11">(C11)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>若不支持<a href="c-language-atomic.html">原子</a>类型和<a href="c-atomic.html">原子操作库</a>则展开成 <span class="t-c"><span class="mw-geshi c source-c"><span class="nu0">1</span></span></span><br />
|
|
<span class="t-mark">(宏常量)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><span class="t-lines"><span>__STDC_NO_COMPLEX__</span></span></div>
|
|
<div><span class="t-lines"><span><span class="t-mark-rev t-since-c11">(C11)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>若不支持<a href="c-language-arithmetic_types.html#.E5.A4.8D.E6.B5.AE.E7.82.B9.E7.B1.BB.E5.9E.8B">复数类型</a>和<a href="c-numeric-complex.html">复数运算库</a>则展开成 <span class="t-c"><span class="mw-geshi c source-c"><span class="nu0">1</span></span></span><br />
|
|
<span class="t-mark">(宏常量)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><span class="t-lines"><span>__STDC_NO_THREADS__</span></span></div>
|
|
<div><span class="t-lines"><span><span class="t-mark-rev t-since-c11">(C11)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>若不支持<a href="c-thread.html">多线程</a>则展开成 <span class="t-c"><span class="mw-geshi c source-c"><span class="nu0">1</span></span></span><br />
|
|
<span class="t-mark">(宏常量)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><span class="t-lines"><span>__STDC_NO_VLA__</span></span></div>
|
|
<div><span class="t-lines"><span><span class="t-mark-rev t-since-c11">(C11)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>若不支持<a href="c-language-array.html#.E9.9D.9E.E5.B8.B8.E9.87.8F.E9.95.BF.E5.BA.A6.E6.95.B0.E7.BB.84">非常量长度数组</a>则展开成 <span class="t-c"><span class="mw-geshi c source-c"><span class="nu0">1</span></span></span><br />
|
|
<span class="t-mark">(宏常量)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><span class="t-lines"><span>__STDC_IEC_60559_BFP__</span></span></div>
|
|
<div><span class="t-lines"><span><span class="t-mark-rev t-since-c23">(C23)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>若支持 IEC 60559 二进制浮点算术则展开成 <span class="t-c"><span class="mw-geshi c source-c">202ymmL</span></span> (日期待定)<br />
|
|
<span class="t-mark">(宏常量)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><span class="t-lines"><span>__STDC_IEC_60559_DFP__</span></span></div>
|
|
<div><span class="t-lines"><span><span class="t-mark-rev t-since-c23">(C23)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>若支持 IEC 60559 十进制浮点算术则展开成 <span class="t-c"><span class="mw-geshi c source-c">202ymmL</span></span> (日期待定)<br />
|
|
<span class="t-mark">(宏常量)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><span class="t-lines"><span>__STDC_IEC_60559_COMPLEX__</span></span></div>
|
|
<div><span class="t-lines"><span><span class="t-mark-rev t-since-c23">(C23)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>若支持 IEC 60559 复数算术则展开成 <span class="t-c"><span class="mw-geshi c source-c">202ymmL</span></span> (日期待定)<br />
|
|
<span class="t-mark">(宏常量)</span></td>
|
|
</tr>
|
|
</table>
|
|
<p>这些宏的值(除了 <code>__FILE__</code> 和 <code>__LINE__</code> )在整个翻译单元中保持常量。尝试重定义或解除定义这些宏导致未定义行为。</p>
|
|
<table class="t-rev-begin">
|
|
<tr class="t-rev t-since-c99">
|
|
<td>
|
|
<p>预定义对象 <span class="t-c"><span class="mw-geshi c source-c">__func__</span></span> (细节见<a href="c-language-function_definition.html#func">函数定义</a>)不是预处理器宏,尽管有时与 <code>__FILE__</code> 及 <code>__LINE__</code> 一同使用它,例如通过 <span class="t-lc"><a href="c-error-assert.html">assert</a></span> 。</p>
|
|
</td>
|
|
<td><span class="t-mark-rev t-since-c99">(C99 起)</span></td>
|
|
</tr>
|
|
</table>
|
|
<h3><span class="mw-headline" id=".E7.A4.BA.E4.BE.8B">示例</span></h3>
|
|
<div class="t-example">
|
|
<div class="t-example-live-link"></div>
|
|
<div dir="ltr" class="mw-geshi" style="text-align: left;">
|
|
<div class="c source-c">
|
|
<pre class="de1"><span class="co2">#include <stdio.h></span>
|
|
|
|
<span class="co1">// 制造函数工厂并使用之</span>
|
|
<span class="co2">#define FUNCTION(name, a) int fun_##name(int x) { return (a)*x;}</span>
|
|
|
|
FUNCTION<span class="br0">(</span>quadruple, <span class="nu0">4</span><span class="br0">)</span>
|
|
FUNCTION<span class="br0">(</span><span class="kw4">double</span>, <span class="nu0">2</span><span class="br0">)</span>
|
|
|
|
<span class="co2">#undef FUNCTION</span>
|
|
<span class="co2">#define FUNCTION 34</span>
|
|
<span class="co2">#define OUTPUT(a) puts( #a )</span>
|
|
|
|
<span class="kw4">int</span> main<span class="br0">(</span><span class="kw4">void</span><span class="br0">)</span>
|
|
<span class="br0">{</span>
|
|
<a href="c-io-fprintf.html"><span class="kw851">printf</span></a><span class="br0">(</span><span class="st0">"quadruple(13): %d<span class="es1">\n</span>"</span>, fun_quadruple<span class="br0">(</span><span class="nu0">13</span><span class="br0">)</span> <span class="br0">)</span><span class="sy4">;</span>
|
|
<a href="c-io-fprintf.html"><span class="kw851">printf</span></a><span class="br0">(</span><span class="st0">"double(21): %d<span class="es1">\n</span>"</span>, fun_double<span class="br0">(</span><span class="nu0">21</span><span class="br0">)</span> <span class="br0">)</span><span class="sy4">;</span>
|
|
<a href="c-io-fprintf.html"><span class="kw851">printf</span></a><span class="br0">(</span><span class="st0">"%d<span class="es1">\n</span>"</span>, FUNCTION<span class="br0">)</span><span class="sy4">;</span>
|
|
OUTPUT<span class="br0">(</span>million<span class="br0">)</span><span class="sy4">;</span> <span class="co1">// 注意缺少引号</span>
|
|
<span class="br0">}</span></pre></div>
|
|
</div>
|
|
<p>输出:</p>
|
|
<div dir="ltr" class="mw-geshi" style="text-align: left;">
|
|
<div class="text source-text">
|
|
<pre class="de1">quadruple(13): 52
|
|
double(21): 42
|
|
34
|
|
million</pre></div>
|
|
</div>
|
|
</div>
|
|
<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.10.3 Macro replacement (p: 121-126)</li>
|
|
</ul>
|
|
</dd>
|
|
</dl>
|
|
<dl>
|
|
<dd>
|
|
<ul>
|
|
<li>6.10.8 Predefined macro names (p: 127-129)</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.10.3 Macro replacement (p: 166-173)</li>
|
|
</ul>
|
|
</dd>
|
|
</dl>
|
|
<dl>
|
|
<dd>
|
|
<ul>
|
|
<li>6.10.8 Predefined macro names (p: 175-176)</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.10.3 Macro replacement (p: 151-158)</li>
|
|
</ul>
|
|
</dd>
|
|
</dl>
|
|
<dl>
|
|
<dd>
|
|
<ul>
|
|
<li>6.10.8 Predefined macro names (p: 160-161)</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.8.3 Macro replacement</li>
|
|
</ul>
|
|
</dd>
|
|
</dl>
|
|
<dl>
|
|
<dd>
|
|
<ul>
|
|
<li>3.8.8 Predefined macro names</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>
|