160 lines
16 KiB
HTML
160 lines
16 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_main_function 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>每个要在宿主环境运行的编码 C 程序都含有称作 <code><b>main</b></code> 的函数定义(非原型),它是函数的受指定起始点。</p>
|
|
<table class="t-sdsc-begin">
|
|
<tr>
|
|
<td colspan="10" class="t-sdsc-sep"></td>
|
|
</tr>
|
|
<tr class="t-sdsc">
|
|
<td><span class="t-c"><span class="mw-geshi c source-c"><span class="kw4">int</span></span></span> <code><b>main</b></code> <code><b>(void)</b></code> <code><b>{</b></code> <span class="t-spar">body</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-c"><span class="mw-geshi c source-c"><span class="kw4">int</span></span></span> <code><b>main</b></code> <code><b>(</b></code><span class="t-c"><span class="mw-geshi c source-c"><span class="kw4">int</span></span></span> <span class="t-spar">argc</span><code><b>,</b></code> <span class="t-c"><span class="mw-geshi c source-c"><span class="kw4">char</span></span></span> <span class="t-c"><span class="mw-geshi c source-c"><span class="sy2">*</span></span></span><span class="t-spar">argv</span><span class="t-c"><span class="mw-geshi c source-c"><span class="br0">[</span><span class="br0">]</span></span></span><code><b>)</b></code> <code><b>{</b></code> <span class="t-spar">body</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><span class="t-c"><span class="mw-geshi c source-c"><span class="coMULTI">/* 其他实现定义签名 */</span></span></span> <span class="t-mark-rev t-since-c99">(C99 起)</span></td>
|
|
<td>(3)</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=".E5.8F.82.E6.95.B0">参数</span></h3>
|
|
<table class="t-par-begin">
|
|
<tr class="t-par">
|
|
<td>argc</td>
|
|
<td>-</td>
|
|
<td>代表程序所运行的环境传递给程序的参数数量。</td>
|
|
</tr>
|
|
<tr class="t-par">
|
|
<td>argv</td>
|
|
<td>-</td>
|
|
<td>指向 <span class="t-c"><span class="mw-geshi c source-c">argc <span class="sy2">+</span> <span class="nu0">1</span></span></span> 个指针的数组的首元素的指针。数组末元素为空指针,而若前面有元素,则它们指向表示从宿主环境传递给程序的参数的字符串。若 <span class="t-c"><span class="mw-geshi c source-c">argv<span class="br0">[</span><span class="nu0">0</span><span class="br0">]</span></span></span> 不是空指针(或等价地 <span class="t-c"><span class="mw-geshi c source-c">argc</span></span> > 0 ),则它指向表示程序名的字符串。若程序名从宿主环境不可用则该字符串为空。</td>
|
|
</tr>
|
|
</table>
|
|
<p>名称 <code>argc</code> 和 <code>argv</code> 表示参数计数和参数向量。参数的名称和类型表示是任意的: <span class="t-c"><span class="mw-geshi c source-c"><span class="kw4">int</span> main<span class="br0">(</span><span class="kw4">int</span> ac, <span class="kw4">char</span><span class="sy2">**</span> av<span class="br0">)</span></span></span> 同样合法。</p>
|
|
<p><code>main</code> 的常见实现定义形式是 <span class="t-c"><span class="mw-geshi c source-c"><span class="kw4">int</span> main<span class="br0">(</span><span class="kw4">int</span> argc, <span class="kw4">char</span> <span class="sy2">*</span>argv<span class="br0">[</span><span class="br0">]</span>, <span class="kw4">char</span> <span class="sy2">*</span>envp<span class="br0">[</span><span class="br0">]</span><span class="br0">)</span></span></span> ,其中第三参数类型为 <span class="t-c"><span class="mw-geshi c source-c"><span class="kw4">char</span><span class="sy2">**</span></span></span> ,指向<a rel="nofollow" class="external text" href="https://pubs.opengroup.org/onlinepubs/9699919799/functions/exec.html">指向<i>执行环境变量</i>的指针数组</a>。</p>
|
|
<h3><span class="mw-headline" id=".E8.BF.94.E5.9B.9E.E5.80.BC">返回值</span></h3>
|
|
<p>若使用返回语句,则返回值会用作隐式调用 <span class="t-lc"><a href="c-program-exit.html">exit()</a></span> 的参数(细节见下)。值零和 <span class="t-lc"><a href="c-program-EXIT_status.html">EXIT_SUCCESS</a></span> 指示成功终止,值 <span class="t-lc"><a href="c-program-EXIT_status.html">EXIT_FAILURE</a></span> 指示不成功终止。</p>
|
|
<h3><span class="mw-headline" id=".E8.A7.A3.E9.87.8A">解释</span></h3>
|
|
<p>在程序启动时,初始化所有静态存储期对象后调用 <code>main</code> 函数。它指明执行于<i>宿主</i>环境(即在操作系统中)的程序入口点。任何<i>独立</i>程序(引导程序、操作系统核心等)的入口点的名称和类型是实现定义的。</p>
|
|
<p>主函数的双参数形式允许从执行环境传递任意的多字节字符串(常称作<i>命令行参数</i>)。指针 <code>argv[1] .. argv[argc-1]</code> 指向每个这些字符串的首字符。 <code>argv[0]</code> 指向代表用于调用程序自身的名称的,空终止多字节字符串的首字符(或者若宿主环境不支持此做法,则保证 <code>argv[0][0]</code> 为零)。</p>
|
|
<p>若宿主环境不能一同提供大写和小写字母,则转换命令行参数为小写。</p>
|
|
<p>字符串可修改,而且任何修改会留存到程序终止时,尽管这些修改不会传播回宿主环境:例如能以 <span class="t-lc"><a href="c-string-byte-strtok.html">strtok</a></span> 使用它们。</p>
|
|
<p><code>argv</code> 所指的数组大小至少是 <code>argc+1</code> ,并保证末元素 <code>argv[argc]</code> 为空指针。</p>
|
|
<p><code>main</code> 函数拥有几个特殊属性:</p>
|
|
<div class="t-li1"><span class="t-li">1)</span> 程序不能提供此函数的原型</div>
|
|
<div class="t-li1"><span class="t-li">2)</span> 若主函数的返回类型与 <span class="t-c"><span class="mw-geshi c source-c"><span class="kw4">int</span></span></span> <a href="c-language-types.html#.E5.85.BC.E5.AE.B9.E7.B1.BB.E5.9E.8B">兼容</a>,则从对 <code>main</code> 的初次调用(但不是任何后继、递归调用)返回,等价于以主函数返回值为参数执行 <span class="t-lc"><a href="c-program-exit.html">exit</a></span> 函数(将调用 <span class="t-lc"><a href="c-program-atexit.html">atexit</a></span> 所注册的函数,冲入并关闭所有流,删除 <span class="t-lc"><a href="c-io-tmpfile.html">tmpfile</a></span> 所创建的文件,并返还控制给执行环境)。</div>
|
|
<div class="t-li1"><span class="t-li">3)</span>
|
|
<table class="t-rev-begin">
|
|
<tr class="t-rev t-until-c99">
|
|
<td>
|
|
<p>若 main 函数执行不指定值的 <span class="t-c"><span class="mw-geshi c source-c"><span class="kw1">return</span></span></span> ,或同样地未执行 <span class="t-c"><span class="mw-geshi c source-c"><span class="kw1">return</span></span></span> 就抵达结尾的 <span class="t-c"><span class="mw-geshi c source-c"><span class="br0">}</span></span></span> ,则返回给宿主环境的终止状态未定义。</p>
|
|
</td>
|
|
<td><span class="t-mark-rev t-until-c99">(C99 前)</span></td>
|
|
</tr>
|
|
<tr class="t-rev t-since-c99">
|
|
<td>
|
|
<p>若 main 函数的返回类型与 <span class="t-c"><span class="mw-geshi c source-c"><span class="kw4">int</span></span></span> 不<a href="c-language-types.html#.E5.85.BC.E5.AE.B9.E7.B1.BB.E5.9E.8B">兼容</a>(如 <span class="t-c"><span class="mw-geshi c source-c"><span class="kw4">void</span> main<span class="br0">(</span><span class="kw4">void</span><span class="br0">)</span></span></span> ),则返回给宿主环境的值未指定。若返回类型与 int 兼容且控制抵达结尾的 <span class="t-c"><span class="mw-geshi c source-c"><span class="br0">}</span></span></span> ,则返回给执行环境的值与如同执行 <span class="t-c"><span class="mw-geshi c source-c"><span class="kw1">return</span> <span class="nu0">0</span><span class="sy4">;</span></span></span> 的结果相同。</p>
|
|
</td>
|
|
<td><span class="t-mark-rev t-since-c99">(C99 起)</span></td>
|
|
</tr>
|
|
</table>
|
|
</div>
|
|
<h3><span class="mw-headline" id=".E7.A4.BA.E4.BE.8B">示例</span></h3>
|
|
<div class="t-example">
|
|
<p>演示如何告知程序其寻找输入处及写结果处。 调用: ./a.out indatafile outdatafile</p>
|
|
<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="kw4">int</span> main<span class="br0">(</span><span class="kw4">int</span> argc, <span class="kw4">char</span> <span class="sy2">*</span>argv<span class="br0">[</span><span class="br0">]</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">"argc = %d<span class="es1">\n</span>"</span>, argc<span class="br0">)</span><span class="sy4">;</span>
|
|
<span class="kw1">for</span><span class="br0">(</span><span class="kw4">int</span> ndx <span class="sy1">=</span> <span class="nu0">0</span><span class="sy4">;</span> ndx <span class="sy3">!</span><span class="sy1">=</span> argc<span class="sy4">;</span> <span class="sy2">++</span>ndx<span class="br0">)</span>
|
|
<a href="c-io-fprintf.html"><span class="kw851">printf</span></a><span class="br0">(</span><span class="st0">"argv[%d] --> %s<span class="es1">\n</span>"</span>, ndx,argv<span class="br0">[</span>ndx<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">"argv[argc] = %p<span class="es1">\n</span>"</span>, <span class="br0">(</span><span class="kw4">void</span><span class="sy2">*</span><span class="br0">)</span>argv<span class="br0">[</span>argc<span class="br0">]</span><span class="br0">)</span><span class="sy4">;</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">argc = 3
|
|
argv[0] --> ./a.out
|
|
argv[1] --> indatafile
|
|
argv[2] --> outdatafile
|
|
argv[argc] = (nil)</pre></div>
|
|
</div>
|
|
</div>
|
|
<h3><span class="mw-headline" id=".E5.BC.95.E7.94.A8">引用</span></h3>
|
|
<div class="t-ref-std-11">
|
|
<ul>
|
|
<li>C11 标准(ISO/IEC 9899:2011):</li>
|
|
</ul>
|
|
<dl>
|
|
<dd>
|
|
<ul>
|
|
<li>5.1.2.2.1 Program startup (p: 13)</li>
|
|
</ul>
|
|
</dd>
|
|
</dl>
|
|
<div class="t-ref-std-c99">
|
|
<ul>
|
|
<li>C99 标准(ISO/IEC 9899:1999):</li>
|
|
</ul>
|
|
<dl>
|
|
<dd>
|
|
<ul>
|
|
<li>5.1.2.2.1 Program startup (p: 12)</li>
|
|
</ul>
|
|
</dd>
|
|
</dl>
|
|
<div class="t-ref-std-c89">
|
|
<ul>
|
|
<li>C89/C90 标准(ISO/IEC 9899:1990):</li>
|
|
</ul>
|
|
<dl>
|
|
<dd>
|
|
<ul>
|
|
<li>5.1.2.2 Hosted environment</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 class="visualClear"></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</body>
|
|
</html>
|