<!DOCTYPE html SYSTEM "about:legacy-compat">
<html lang="zh-cn"><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta content="width=device-width, initial-scale=1" name="viewport">
<!--
        XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
              This file is generated from xml source: DO NOT EDIT
        XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
      -->
<title>Apache 2.0 文档 - Apache HTTP 服务器 版本 2.5</title>
<link href="../style/css/manual.css" rel="stylesheet" media="all" type="text/css" title="Main stylesheet">
<link href="../style/css/manual-loose-100pc.css" rel="alternate stylesheet" media="all" type="text/css" title="No Sidebar - Default font size">
<link href="../style/css/manual-print.css" rel="stylesheet" media="print" type="text/css"><link rel="stylesheet" type="text/css" href="../style/css/prettify.css">
<script src="../style/scripts/prettify.min.js">
</script>

<link href="../images/favicon.png" rel="shortcut icon"></head>
<body id="manual-page" class="no-sidebar"><div id="page-header">
<p class="menu"><a href="../mod/">模块</a> | <a href="../mod/quickreference.html">指令</a> | <a href="https://cwiki.apache.org/confluence/display/httpd/FAQ">常见问题</a> | <a href="../glossary.html">术语</a> | <a href="../sitemap.html">网站导航</a> | <a href="https://bz.apache.org/bugzilla/enter_bug.cgi?product=Apache%20httpd-2">Report a bug</a></p>
<p class="apache">Apache HTTP 服务器版本 2.5</p>
<img alt="" src="../images/feather.png"></div>
<div class="up"><a href="./"><img title="<-" alt="<-" src="../images/left.gif"></a></div>
<div id="path">
<a href="https://www.apache.org/">Apache</a> &gt; <a href="https://httpd.apache.org/">HTTP 服务器</a> &gt; <a href="https://httpd.apache.org/docs/">文档</a> &gt; <a href="../">版本 2.5</a> &gt; <a href="./">开发者文档</a></div><div id="page-content"><div id="preamble"><h1>Apache 2.0 文档</h1>
<button aria-label="Toggle language list" class="lang-toggle"><svg xmlns="http://www.w3.org/2000/svg" stroke-width="2" stroke="currentColor" fill="none" viewBox="0 0 24 24" height="16" width="16"><circle r="10" cy="12" cx="12"/><line y2="12" x2="22" y1="12" x1="2"/><path d="M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z"/></svg></button>
<div class="toplang">
<p><span>可用语言: </span><a href="../en/developer/documenting.html" hreflang="en" rel="alternate" title="English">&nbsp;en&nbsp;</a> |
<a href="../zh-cn/developer/documenting.html" title="Simplified Chinese">&nbsp;zh-cn&nbsp;</a></p>
</div>
<div class="outofdate">此翻译可能过期。要了解最近的更改，请阅读英文版。</div>

    <p>Apache 2.0 使用 <a href="http://www.doxygen.org/">Doxygen</a> 从代码中
    生成 API 和全局变量的文档。下面是对使用 Doxygen 生成文档的简介。</p>
</div>
<div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif"></a></div>
<div class="section">
<h2 id="brief">简要说明 <a title="Permanent link" href="#brief" class="permalink">&para;</a></h2>
    <p>使用 <code>/**</code> 开始文档块<br>
    使用 <code>*/</code> 结束文档块</p>

    <p>在文档块中，我们可以使用多个标签:</p>

    <div class="example"><p><code>
      Description of this functions purpose<br>
      @param parameter_name description<br>
      @return description<br>
      @deffunc signature of the function<br>
    </code></p></div>
      
    <p>一般不需要 <code>deffunc</code> 。DoxyGen 没有完整的解析器，所以任何
    在返回类型声明中使用宏的原型，都是太复杂了。这些函数就需要使用 <code>deffunc</code>。
    例如 (使用 &amp;gt; 而不是 &gt;):</p>

    <div class="example"><p><code>
      /**<br>
 &nbsp;* return the final element of the pathname<br>
 &nbsp;* @param pathname The path to get the final element of<br>
 &nbsp;* @return the final element of the path<br>
 &nbsp;* @tip Examples:<br>
 &nbsp;* &lt;pre&gt;<br>
 &nbsp;*                 "/foo/bar/gum"   -&amp;gt; "gum"<br>
 &nbsp;*                 "/foo/bar/gum/"  -&amp;gt; ""<br>
 &nbsp;*                 "gum"            -&amp;gt; "gum"<br>
 &nbsp;*                 "wi\\n32\\stuff" -&amp;gt; "stuff"<br>
 &nbsp;* &lt;/pre&gt;<br>
 &nbsp;* @deffunc const char * ap_filename_of_pathname(const char *pathname)<br>
 &nbsp;*/
    </code></p></div>

    <p>总是在头文件开始包含:</p>
    <div class="example"><p><code>
      /**<br>
 &nbsp;* @package Name of library header<br>
 &nbsp;*/
    </code></p></div>

    <p>Doxygen 为每个包生成一个新的 HTML 文件，名字是
    {Name_of_library_header}.html，所以请简化名称。</p>

    <p>更深入的讨论，请参见
    <a href="http://www.doxygen.org/">Doxygen 站点</a>。</p>
</div></div>
<div class="bottomlang">
<p><span>可用语言: </span><a href="../en/developer/documenting.html" hreflang="en" rel="alternate" title="English">&nbsp;en&nbsp;</a> |
<a href="../zh-cn/developer/documenting.html" title="Simplified Chinese">&nbsp;zh-cn&nbsp;</a></p>
</div><div id="footer">
<p class="apache">Copyright 2026 The Apache Software Foundation.<br>基于 <a href="https://www.apache.org/licenses/LICENSE-2.0">Apache License, Version 2.0</a> 许可证.</p>
<p class="menu"><a href="../mod/">模块</a> | <a href="../mod/quickreference.html">指令</a> | <a href="https://cwiki.apache.org/confluence/display/httpd/FAQ">常见问题</a> | <a href="../glossary.html">术语</a> | <a href="../sitemap.html">网站导航</a> | <a href="https://bz.apache.org/bugzilla/enter_bug.cgi?product=Apache%20httpd-2">Report a bug</a></p></div><script><!--//--><![CDATA[//><!--
if (typeof(prettyPrint) !== 'undefined') {
    prettyPrint();
}
var langToggle = document.querySelector('.lang-toggle');
var topLang = document.querySelector('.toplang');
if (langToggle && topLang) {
    langToggle.addEventListener('click', function() { topLang.classList.toggle('open'); });
}
var qv = document.getElementById('quickview');
if (qv) {
    document.body.appendChild(qv);
    var qvBtn = document.createElement('button');
    qvBtn.className = 'qv-toggle';
    qvBtn.setAttribute('aria-label', 'Toggle page navigation');
    qvBtn.innerHTML = '&#9776;';
    document.body.appendChild(qvBtn);
    qvBtn.addEventListener('click', function() {
        var isOpen = qv.classList.toggle('open');
        if (isOpen) {
            qv.style.top = window.scrollY + 10 + 'px';
        }
    });
    window.addEventListener('scroll', function() { qv.classList.remove('open'); });
}
//--><!]]></script>
</body></html>