gsphinx.addnodesdocument)}( rawsourcechildren]( translations LanguagesNode)}(hhh](h pending_xref)}(hhh]docutils.nodesTextEnglish}parenthsba attributes}(ids]classes]names]dupnames]backrefs] refdomainstdreftypedoc reftarget/doc-guide/kernel-docmodnameN classnameN refexplicitutagnamehhh ubh)}(hhh]hChinese (Traditional)}hh2sbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget(/translations/zh_TW/doc-guide/kernel-docmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hItalian}hhFsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget(/translations/it_IT/doc-guide/kernel-docmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hJapanese}hhZsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget(/translations/ja_JP/doc-guide/kernel-docmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hKorean}hhnsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget(/translations/ko_KR/doc-guide/kernel-docmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hSpanish}hhsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget(/translations/sp_SP/doc-guide/kernel-docmodnameN classnameN refexplicituh1hhh ubeh}(h]h ]h"]h$]h&]current_languageChinese (Simplified)uh1h hh _documenthsourceNlineNubhnote)}(hX{此文件的目的是为让中文读者更容易阅读和理解,而不是作为一个分支。 因此, 如果您对此文件有任何意见或更新,请先尝试更新原始英文文件。 如果您发现本文档与原始文件有任何不同或者有翻译问题,请发建议或者补丁给 该文件的译者,或者请求中文文档维护者和审阅者的帮助。h]h paragraph)}(hX{此文件的目的是为让中文读者更容易阅读和理解,而不是作为一个分支。 因此, 如果您对此文件有任何意见或更新,请先尝试更新原始英文文件。 如果您发现本文档与原始文件有任何不同或者有翻译问题,请发建议或者补丁给 该文件的译者,或者请求中文文档维护者和审阅者的帮助。h]hX{此文件的目的是为让中文读者更容易阅读和理解,而不是作为一个分支。 因此, 如果您对此文件有任何意见或更新,请先尝试更新原始英文文件。 如果您发现本文档与原始文件有任何不同或者有翻译问题,请发建议或者补丁给 该文件的译者,或者请求中文文档维护者和审阅者的帮助。}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hh5Documentation/translations/zh_CN/disclaimer-zh_CN.rsthKhhubah}(h]h ]h"]h$]h&]uh1hhhhhhhhNubh field_list)}(hhh](hfield)}(hhh](h field_name)}(hOriginalh]hOriginal}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhU/var/lib/git/docbuild/linux/Documentation/translations/zh_CN/doc-guide/kernel-doc.rsthKubh field_body)}(h'Documentation/doc-guide/kernel-doc.rst h]h)}(h&Documentation/doc-guide/kernel-doc.rsth]h&Documentation/doc-guide/kernel-doc.rst}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhhubah}(h]h ]h"]h$]h&]uh1hhhubeh}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(hhh](h)}(h译者h]h译者}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhhhKubh)}(h*吴想成 Wu XiangCheng h]h)}(h)吴想成 Wu XiangCheng h](h吴想成 Wu XiangCheng <}(hjhhhNhNubh reference)}(hbobwxc@email.cnh]hbobwxc@email.cn}(hjhhhNhNubah}(h]h ]h"]h$]h&]refurimailto:bobwxc@email.cnuh1jhjubh>}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhj ubah}(h]h ]h"]h$]h&]uh1hhhubeh}(h]h ]h"]h$]h&]uh1hhhhKhhhhubeh}(h]h ]h"]h$]h&]uh1hhhhhhhhKubhsection)}(hhh](htitle)}(h编写kernel-doc注释h]h编写kernel-doc注释}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1jIhjFhhhhhKubh)}(hLinux内核源文件可以包含kernel-doc格式的结构化文档注释,用以描述代码的函数、 类型和设计。将文档嵌入源文件更容易保持文档最新。h]hLinux内核源文件可以包含kernel-doc格式的结构化文档注释,用以描述代码的函数、 类型和设计。将文档嵌入源文件更容易保持文档最新。}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK hjFhhubh)}(h内核文档格式与javadoc、gtk-doc或Doxygen看似很相似,但由于历史原因, 实际有着明显的不同。内核源包含成千上万个kernel-doc注释。请坚持遵循 此处描述的风格。h]h)}(h内核文档格式与javadoc、gtk-doc或Doxygen看似很相似,但由于历史原因, 实际有着明显的不同。内核源包含成千上万个kernel-doc注释。请坚持遵循 此处描述的风格。h]h内核文档格式与javadoc、gtk-doc或Doxygen看似很相似,但由于历史原因, 实际有着明显的不同。内核源包含成千上万个kernel-doc注释。请坚持遵循 此处描述的风格。}(hjkhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK hjgubah}(h]h ]h"]h$]h&]uh1hhjFhhhhhNubh)}(h[kernel-doc无法包含Rust代码:请参考 Documentation/rust/general-information.rst 。h]h)}(hjh]h[kernel-doc无法包含Rust代码:请参考 Documentation/rust/general-information.rst 。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1hhjFhhhhhNubh)}(h从注释中提取kernel-doc结构,并从中生成适当的 `Sphinx C 域`_ 函数和带有锚点的 类型描述。这些注释将被过滤以生成特殊kernel-doc高亮和交叉引用。详见下文。h](h>从注释中提取kernel-doc结构,并从中生成适当的 }(hjhhhNhNubj)}(h`Sphinx C 域`_h]h Sphinx C 域}(hjhhhNhNubah}(h]h ]h"]h$]h&]name Sphinx C 域refuri0http://www.sphinx-doc.org/en/stable/domains.htmluh1jhjresolvedKubh 函数和带有锚点的 类型描述。这些注释将被过滤以生成特殊kernel-doc高亮和交叉引用。详见下文。}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjFhhubhtarget)}(hB.. _Sphinx C 域: http://www.sphinx-doc.org/en/stable/domains.htmlh]h}(h]sphinx-cah ]h"] sphinx c 域ah$]h&]jjuh1jhK!hjFhhhh، referencedKubh)}(h使用 ``EXPORT_SYMBOL`` 或 ``EXPORT_SYMBOL_GPL`` 导出到可加载模块的每个函数都 应该有一个kernel-doc注释。模块使用的头文件中的函数和数据结构也应该有 kernel-doc注释。h](h使用 }(hjhhhNhNubhliteral)}(h``EXPORT_SYMBOL``h]h EXPORT_SYMBOL}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh 或 }(hjhhhNhNubj)}(h``EXPORT_SYMBOL_GPL``h]hEXPORT_SYMBOL_GPL}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh 导出到可加载模块的每个函数都 应该有一个kernel-doc注释。模块使用的头文件中的函数和数据结构也应该有 kernel-doc注释。}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjFhhubh)}(hX[对于其他内核文件(未标记为 ``static`` )中外部可见的函数,提供kernel-doc格式 的文档是一个很好的实践。我们也建议为私有(文件 ``static`` )程序提供kernel-doc 格式的文档,以确保内核源代码布局的一致性。此建议优先级较低,由内核源文件的 维护者自行决定。h](h(对于其他内核文件(未标记为 }(hjhhhNhNubj)}(h ``static``h]hstatic}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh| )中外部可见的函数,提供kernel-doc格式 的文档是一个很好的实践。我们也建议为私有(文件 }(hjhhhNhNubj)}(h ``static``h]hstatic}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh )程序提供kernel-doc 格式的文档,以确保内核源代码布局的一致性。此建议优先级较低,由内核源文件的 维护者自行决定。}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjFhhubjE)}(hhh](jJ)}(h如何格式化kernel-doc注释h]h如何格式化kernel-doc注释}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1jIhj0hhhhhK"ubh)}(hkernel-doc注释用 ``/**`` 作为开始标记。 ``kernel-doc`` 工具将提取以这种方式 标记的注释。注释其余部分的格式类似于一个普通的多行注释,左侧有一列星号,以 ``*/`` 行结束。h](hkernel-doc注释用 }(hjAhhhNhNubj)}(h``/**``h]h/**}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjAubh 作为开始标记。 }(hjAhhhNhNubj)}(h``kernel-doc``h]h kernel-doc}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjAubh 工具将提取以这种方式 标记的注释。注释其余部分的格式类似于一个普通的多行注释,左侧有一列星号,以 }(hjAhhhNhNubj)}(h``*/``h]h*/}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjAubh 行结束。}(hjAhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK$hj0hhubh)}(h函数和类型的kernel-doc注释应该放在所描述的函数或类型之前,以便最大限度地提高 更改代码的人同时更改文档的可能性。概述kernel-doc注释可以放在最顶部的任何地方。h]h函数和类型的kernel-doc注释应该放在所描述的函数或类型之前,以便最大限度地提高 更改代码的人同时更改文档的可能性。概述kernel-doc注释可以放在最顶部的任何地方。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK(hj0hhubh)}(h用详细模式和不生成实际输出来运行 ``kernel-doc`` 工具,可以验证文档注释的格式 是否正确。例如::h](h1用详细模式和不生成实际输出来运行 }(hjhhhNhNubj)}(h``kernel-doc``h]h kernel-doc}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhB 工具,可以验证文档注释的格式 是否正确。例如:}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK+hj0hhubh literal_block)}(h-scripts/kernel-doc -v -none drivers/foo/bar.ch]h-scripts/kernel-doc -v -none drivers/foo/bar.c}hjsbah}(h]h ]h"]h$]h&] xml:spacepreserveuh1jhhhK.hj0hhubh)}(hJ当请求执行额外的gcc检查时,内核构建将验证文档格式::h]hI当请求执行额外的gcc检查时,内核构建将验证文档格式:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK0hj0hhubj)}(hmake W=nh]hmake W=n}hjsbah}(h]h ]h"]h$]h&]jjuh1jhhhK2hj0hhubeh}(h]id1ah ]h"]如何格式化kernel-doc注释ah$]h&]uh1jDhjFhhhhhK"ubjE)}(hhh](jJ)}(h 函数文档h]h 函数文档}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jIhjhhhhhK5ubh)}(h<函数和函数式宏的kernel-doc注释的一般格式是::h]h;函数和函数式宏的kernel-doc注释的一般格式是:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK7hjhhubj)}(hXq/** * 函数名() - 函数简要说明. * @参数1: 描述第一个参数. * @参数2: 描述第二个参数. * 可以为参数提供一段 * 多行描述. * * 更详细的描述,进一步讨论函数 函数名(), 这可能对使用或修改它的人有用. * 以空注释行开始, 内部可以包含空注释行. * * 详细描述可以有多个段落. * * Context: 描述函数是否可以休眠, 它需要、释放或期望持有什么锁. * 可以写多行. * Return: 描述函数返回值. * * 返回值描述也可以有多个段落, * 并且应该放在注释块的末尾. */h]hXq/** * 函数名() - 函数简要说明. * @参数1: 描述第一个参数. * @参数2: 描述第二个参数. * 可以为参数提供一段 * 多行描述. * * 更详细的描述,进一步讨论函数 函数名(), 这可能对使用或修改它的人有用. * 以空注释行开始, 内部可以包含空注释行. * * 详细描述可以有多个段落. * * Context: 描述函数是否可以休眠, 它需要、释放或期望持有什么锁. * 可以写多行. * Return: 描述函数返回值. * * 返回值描述也可以有多个段落, * 并且应该放在注释块的末尾. */}hjsbah}(h]h ]h"]h$]h&]jjuh1jhhhK9hjhhubh)}(hl函数名后面的简短描述可以跨多行,并以参数描述、空注释行或注释块结尾结束。h]hl函数名后面的简短描述可以跨多行,并以参数描述、空注释行或注释块结尾结束。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKMhjhhubjE)}(hhh](jJ)}(h 函数参数h]h 函数参数}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1jIhj$hhhhhKPubh)}(h每个函数参数都应该按照顺序描述,紧跟在函数简要说明之后。不要在函数描述和参数 之间,也不要在参数之间留空。h]h每个函数参数都应该按照顺序描述,紧跟在函数简要说明之后。不要在函数描述和参数 之间,也不要在参数之间留空。}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKRhj$hhubh)}(h,每个 ``@参数:`` 描述可以跨多行。h](h每个 }(hjChhhNhNubj)}(h ``@参数:``h]h@参数:}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjCubh 描述可以跨多行。}(hjChhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKUhj$hhubh)}(h如果 ``@参数`` 描述有多行,则说明的续行应该从上一行的同一列开始:: * @参数: 较长说明 * 的续行 或:: * @参数: * 较长说明 * 的续行h](h)}(h]如果 ``@参数`` 描述有多行,则说明的续行应该从上一行的同一列开始::h](h如果 }(hjghhhNhNubj)}(h ``@参数``h]h@参数}(hjohhhNhNubah}(h]h ]h"]h$]h&]uh1jhjgubhJ 描述有多行,则说明的续行应该从上一行的同一列开始:}(hjghhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKYhjcubj)}(h** @参数: 较长说明 * 的续行h]h** @参数: 较长说明 * 的续行}hjsbah}(h]h ]h"]h$]h&]jjuh1jhhhK[hjcubh)}(h或::h]h或:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK^hjcubj)}(h5* @参数: * 较长说明 * 的续行h]h5* @参数: * 较长说明 * 的续行}hjsbah}(h]h ]h"]h$]h&]jjuh1jhhhK`hjcubeh}(h]h ]h"]h$]h&]uh1hhj$hhhhhNubh)}(hQ如果函数的参数数目可变,则需用kernel-doc格式对其进行描述::h]hP如果函数的参数数目可变,则需用kernel-doc格式对其进行描述:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKdhj$hhubj)}(h* @...: 描述h]h* @...: 描述}hjsbah}(h]h ]h"]h$]h&]jjuh1jhhhKfhj$hhubeh}(h]id3ah ]h"] 函数参数ah$]h&]uh1jDhjhhhhhKPubjE)}(hhh](jJ)}(h函数上下文h]h函数上下文}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jIhjhhhhhKiubh)}(h可调用函数的上下文应该在 ``Context`` 节中描述。此节应该包括函数是休眠的还是 可以从中断上下文调用的,以及它需要什么锁、释放什么锁和期望它的调用者持有什么 锁。h](h%可调用函数的上下文应该在 }(hjhhhNhNubj)}(h ``Context``h]hContext}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh 节中描述。此节应该包括函数是休眠的还是 可以从中断上下文调用的,以及它需要什么锁、释放什么锁和期望它的调用者持有什么 锁。}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKkhjhhubh)}(h例如::h]h例如:}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKohjhhubj)}(hXj* Context: Any context. * Context: Any context. Takes and releases the RCU lock. * Context: Any context. Expects to be held by caller. * Context: Process context. May sleep if @gfp flags permit. * Context: Process context. Takes and releases . * Context: Softirq or process context. Takes and releases , BH-safe. * Context: Interrupt context.h]hXj* Context: Any context. * Context: Any context. Takes and releases the RCU lock. * Context: Any context. Expects to be held by caller. * Context: Process context. May sleep if @gfp flags permit. * Context: Process context. Takes and releases . * Context: Softirq or process context. Takes and releases , BH-safe. * Context: Interrupt context.}hjsbah}(h]h ]h"]h$]h&]jjuh1jhhhKqhjhhubeh}(h]id4ah ]h"]函数上下文ah$]h&]uh1jDhjhhhhhKiubjE)}(hhh](jJ)}(h 返回值h]h 返回值}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1jIhj0hhhhhKzubh)}(h3如有返回值,应在 ``Return`` 节中描述。h](h如有返回值,应在 }(hjAhhhNhNubj)}(h ``Return``h]hReturn}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjAubh 节中描述。}(hjAhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK|hj0hhubh)}(hX#) 您提供的多行描述文本 *不会* 识别换行符,因此如果您想将某些文本预格式化, 如:: * Return: * 0 - OK * -EINVAL - invalid argument * -ENOMEM - out of memory 它们在最终文档中变成一行:: Return: 0 - OK -EINVAL - invalid argument -ENOMEM - out of memory 因此,为了在需要的地方换行,您需要使用ReST列表,例如:: * Return: * * 0 - OK to runtime suspend the device * * -EBUSY - Device should not be runtime suspended #) 如果您提供的描述性文本中的行以某个后跟冒号的短语开头,则每一个这种短语 都将被视为新的节标题,可能会产生意料不到的效果。h]henumerated_list)}(hhh](h list_item)}(hX您提供的多行描述文本 *不会* 识别换行符,因此如果您想将某些文本预格式化, 如:: * Return: * 0 - OK * -EINVAL - invalid argument * -ENOMEM - out of memory 它们在最终文档中变成一行:: Return: 0 - OK -EINVAL - invalid argument -ENOMEM - out of memory 因此,为了在需要的地方换行,您需要使用ReST列表,例如:: * Return: * * 0 - OK to runtime suspend the device * * -EBUSY - Device should not be runtime suspended h](h)}(hp您提供的多行描述文本 *不会* 识别换行符,因此如果您想将某些文本预格式化, 如::h](h您提供的多行描述文本 }(hjphhhNhNubhemphasis)}(h*不会*h]h不会}(hjzhhhNhNubah}(h]h ]h"]h$]h&]uh1jxhjpubhH 识别换行符,因此如果您想将某些文本预格式化, 如:}(hjphhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjlubj)}(hI* Return: * 0 - OK * -EINVAL - invalid argument * -ENOMEM - out of memoryh]hI* Return: * 0 - OK * -EINVAL - invalid argument * -ENOMEM - out of memory}hjsbah}(h]h ]h"]h$]h&]jjuh1jhhhKhjlubh)}(h&它们在最终文档中变成一行::h]h%它们在最终文档中变成一行:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjlubj)}(hAReturn: 0 - OK -EINVAL - invalid argument -ENOMEM - out of memoryh]hAReturn: 0 - OK -EINVAL - invalid argument -ENOMEM - out of memory}hjsbah}(h]h ]h"]h$]h&]jjuh1jhhhKhjlubh)}(hN因此,为了在需要的地方换行,您需要使用ReST列表,例如::h]hM因此,为了在需要的地方换行,您需要使用ReST列表,例如:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjlubj)}(hy* Return: * * 0 - OK to runtime suspend the device * * -EBUSY - Device should not be runtime suspendedh]hy* Return: * * 0 - OK to runtime suspend the device * * -EBUSY - Device should not be runtime suspended}hjsbah}(h]h ]h"]h$]h&]jjuh1jhhhKhjlubeh}(h]h ]h"]h$]h&]uh1jjhjgubjk)}(h如果您提供的描述性文本中的行以某个后跟冒号的短语开头,则每一个这种短语 都将被视为新的节标题,可能会产生意料不到的效果。h]h)}(h如果您提供的描述性文本中的行以某个后跟冒号的短语开头,则每一个这种短语 都将被视为新的节标题,可能会产生意料不到的效果。h]h如果您提供的描述性文本中的行以某个后跟冒号的短语开头,则每一个这种短语 都将被视为新的节标题,可能会产生意料不到的效果。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jjhjgubeh}(h]h ]h"]h$]h&]enumtypearabicprefixhsuffix)uh1jehjaubah}(h]h ]h"]h$]h&]uh1hhj0hhhNhNubeh}(h]id5ah ]h"] 返回值ah$]h&]uh1jDhjhhhhhKzubeh}(h]id2ah ]h"] 函数文档ah$]h&]uh1jDhjFhhhhhK5ubjE)}(hhh](jJ)}(h*结构体、共用体、枚举类型文档h]h*结构体、共用体、枚举类型文档}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jIhjhhhhhKubh)}(hi结构体(struct)、共用体(union)、枚举(enum)类型kernel-doc注释的一般格式为::h]hh结构体(struct)、共用体(union)、枚举(enum)类型kernel-doc注释的一般格式为:}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubj)}(h/** * struct 结构体名 - 简要描述. * @成员1: 成员1描述. * @成员2: 成员2描述. * 可以为成员提供 * 多行描述. * * 结构体的描述. */h]h/** * struct 结构体名 - 简要描述. * @成员1: 成员1描述. * @成员2: 成员2描述. * 可以为成员提供 * 多行描述. * * 结构体的描述. */}hj6sbah}(h]h ]h"]h$]h&]jjuh1jhhhKhjhhubh)}(h可以用 ``union`` 或 ``enum`` 替换上面示例中的 ``struct`` ,以描述共用体或枚举。 ``成员`` 用于表示枚举中的元素或共用体成员。h](h 可以用 }(hjDhhhNhNubj)}(h ``union``h]hunion}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjDubh 或 }(hjDhhhNhNubj)}(h``enum``h]henum}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjDubh 替换上面示例中的 }(hjDhhhNhNubj)}(h ``struct``h]hstruct}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1jhjDubh# ,以描述共用体或枚举。 }(hjDhhhNhNubj)}(h ``成员``h]h成员}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjDubh4 用于表示枚举中的元素或共用体成员。}(hjDhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjhhubh)}(hu结构体名称后面的简要说明可以跨多行,并以成员说明、空白注释行或注释块结尾结束。h]hu结构体名称后面的简要说明可以跨多行,并以成员说明、空白注释行或注释块结尾结束。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubjE)}(hhh](jJ)}(h成员h]h成员}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jIhjhhhhhKubh)}(h结构体、共用体和枚举的成员应以与函数参数相同的方式记录;它们后紧跟简短的描述, 并且为多行。h]h结构体、共用体和枚举的成员应以与函数参数相同的方式记录;它们后紧跟简短的描述, 并且为多行。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubh)}(h在结构体或共用体描述中,可以使用 ``private:`` 和 ``public:`` 注释标签。 ``private:`` 域内的字段不会列在生成的文档中。h](h1在结构体或共用体描述中,可以使用 }(hjhhhNhNubj)}(h ``private:``h]hprivate:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh 和 }(hjhhhNhNubj)}(h ``public:``h]hpublic:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh 注释标签。 }(hjhhhNhNubj)}(h ``private:``h]hprivate:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh1 域内的字段不会列在生成的文档中。}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjhhubh)}(h``private:`` 和 ``public:`` 标签必须紧跟在 ``/*`` 注释标记之后。可以选择是否 在 ``:`` 和 ``*/`` 结束标记之间包含注释。h](j)}(h ``private:``h]hprivate:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh 和 }(hj hhhNhNubj)}(h ``public:``h]hpublic:}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh 标签必须紧跟在 }(hj hhhNhNubj)}(h``/*``h]h/*}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh- 注释标记之后。可以选择是否 在 }(hj hhhNhNubj)}(h``:``h]h:}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh 和 }hj sbj)}(h``*/``h]h*/}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh" 结束标记之间包含注释。}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjhhubh)}(h例子::h]h例子:}(hjohhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubj)}(hX/** * struct 张三 - 简短描述 * @a: 第一个成员 * @b: 第二个成员 * @d: 第三个成员 * * 详细描述 */ struct 张三 { int a; int b; /* private: 仅内部使用 */ int c; /* public: 下一个是公有的 */ int d; };h]hX/** * struct 张三 - 简短描述 * @a: 第一个成员 * @b: 第二个成员 * @d: 第三个成员 * * 详细描述 */ struct 张三 { int a; int b; /* private: 仅内部使用 */ int c; /* public: 下一个是公有的 */ int d; };}hj}sbah}(h]h ]h"]h$]h&]jjuh1jhhhKhjhhubeh}(h]id7ah ]h"]成员ah$]h&]uh1jDhjhhhhhKubjE)}(hhh](jJ)}(h嵌套的结构体/共用体h]h嵌套的结构体/共用体}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jIhjhhhhhKubh)}(h0嵌套的结构体/共用体可像这样记录::h]h/嵌套的结构体/共用体可像这样记录:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubj)}(hX/** * struct nested_foobar - a struct with nested unions and structs * @memb1: first member of anonymous union/anonymous struct * @memb2: second member of anonymous union/anonymous struct * @memb3: third member of anonymous union/anonymous struct * @memb4: fourth member of anonymous union/anonymous struct * @bar: non-anonymous union * @bar.st1: struct st1 inside @bar * @bar.st2: struct st2 inside @bar * @bar.st1.memb1: first member of struct st1 on union bar * @bar.st1.memb2: second member of struct st1 on union bar * @bar.st2.memb1: first member of struct st2 on union bar * @bar.st2.memb2: second member of struct st2 on union bar */ struct nested_foobar { /* Anonymous union/struct*/ union { struct { int memb1; int memb2; }; struct { void *memb3; int memb4; }; }; union { struct { int memb1; int memb2; } st1; struct { void *memb1; int memb2; } st2; } bar; };h]hX/** * struct nested_foobar - a struct with nested unions and structs * @memb1: first member of anonymous union/anonymous struct * @memb2: second member of anonymous union/anonymous struct * @memb3: third member of anonymous union/anonymous struct * @memb4: fourth member of anonymous union/anonymous struct * @bar: non-anonymous union * @bar.st1: struct st1 inside @bar * @bar.st2: struct st2 inside @bar * @bar.st1.memb1: first member of struct st1 on union bar * @bar.st1.memb2: second member of struct st1 on union bar * @bar.st2.memb1: first member of struct st2 on union bar * @bar.st2.memb2: second member of struct st2 on union bar */ struct nested_foobar { /* Anonymous union/struct*/ union { struct { int memb1; int memb2; }; struct { void *memb3; int memb4; }; }; union { struct { int memb1; int memb2; } st1; struct { void *memb1; int memb2; } st2; } bar; };}hjsbah}(h]h ]h"]h$]h&]jjuh1jhhhKhjhhubh)}(hX#) 在记录嵌套结构体或共用体时,如果结构体/共用体 ``张三`` 已命名,则其中 的成员 ``李四`` 应记录为 ``@张三.李四:`` #) 当嵌套结构体/共用体是匿名的时,其中的成员 ``李四`` 应记录为 ``@李四:``h]jf)}(hhh](jk)}(h在记录嵌套结构体或共用体时,如果结构体/共用体 ``张三`` 已命名,则其中 的成员 ``李四`` 应记录为 ``@张三.李四:`` h]h)}(h在记录嵌套结构体或共用体时,如果结构体/共用体 ``张三`` 已命名,则其中 的成员 ``李四`` 应记录为 ``@张三.李四:``h](hD在记录嵌套结构体或共用体时,如果结构体/共用体 }(hjhhhNhNubj)}(h ``张三``h]h张三}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh! 已命名,则其中 的成员 }(hjhhhNhNubj)}(h ``李四``h]h李四}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh 应记录为 }(hjhhhNhNubj)}(h``@张三.李四:``h]h@张三.李四:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jjhjubjk)}(hb当嵌套结构体/共用体是匿名的时,其中的成员 ``李四`` 应记录为 ``@李四:``h]h)}(hjh](h>当嵌套结构体/共用体是匿名的时,其中的成员 }(hjhhhNhNubj)}(h ``李四``h]h李四}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh 应记录为 }(hjhhhNhNubj)}(h ``@李四:``h]h@李四:}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jjhjubeh}(h]h ]h"]h$]h&]jjjhjjuh1jehjubah}(h]h ]h"]h$]h&]uh1hhjhhhNhNubeh}(h]id8ah ]h"]嵌套的结构体/共用体ah$]h&]uh1jDhjhhhhhKubjE)}(hhh](jJ)}(h行间注释文档h]h行间注释文档}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1jIhj\hhhhhKubh)}(hX结构成员也可在定义时以行间注释形式记录。有两种样式,一种是单行注释,其中开始 ``/**`` 和结束 ``*/`` 位于同一行;另一种是多行注释,开头结尾各自位于一行,就 像所有其他核心文档注释一样::h](hs结构成员也可在定义时以行间注释形式记录。有两种样式,一种是单行注释,其中开始 }(hjmhhhNhNubj)}(h``/**``h]h/**}(hjuhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjmubh 和结束 }(hjmhhhNhNubj)}(h``*/``h]h*/}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjmubh{ 位于同一行;另一种是多行注释,开头结尾各自位于一行,就 像所有其他核心文档注释一样:}(hjmhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhj\hhubj)}(hXk/** * struct 张三 - 简短描述. * @张三: 成员张三. */ struct 张三 { int 张三; /** * @李四: 成员李四. */ int 李四; /** * @王五: 成员王五. * * 此处,成员描述可以为好几段. */ int 王五; union { /** @儿子: 单行描述. */ int 儿子; }; /** @赵六: 描述@张三里面的结构体@赵六 */ struct { /** * @赵六.女儿: 描述@张三.赵六里面的@女儿 */ int 女儿; } 赵六; };h]hXk/** * struct 张三 - 简短描述. * @张三: 成员张三. */ struct 张三 { int 张三; /** * @李四: 成员李四. */ int 李四; /** * @王五: 成员王五. * * 此处,成员描述可以为好几段. */ int 王五; union { /** @儿子: 单行描述. */ int 儿子; }; /** @赵六: 描述@张三里面的结构体@赵六 */ struct { /** * @赵六.女儿: 描述@张三.赵六里面的@女儿 */ int 女儿; } 赵六; };}hjsbah}(h]h ]h"]h$]h&]jjuh1jhhhMhj\hhubeh}(h]id9ah ]h"]行间注释文档ah$]h&]uh1jDhjhhhhhKubeh}(h]id6ah ]h"]*结构体、共用体、枚举类型文档ah$]h&]uh1jDhjFhhhhhKubjE)}(hhh](jJ)}(h Typedef文档h]h Typedef文档}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jIhjhhhhhMubh)}(h4Typedef的kernel-doc文档注释的一般格式为::h]h3Typedef的kernel-doc文档注释的一般格式为:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM!hjhhubj)}(hC/** * typedef 类型名称 - 简短描述. * * 类型描述. */h]hC/** * typedef 类型名称 - 简短描述. * * 类型描述. */}hjsbah}(h]h ]h"]h$]h&]jjuh1jhhhM#hjhhubh)}(h-还可以记录带有函数原型的typedef::h]h,还可以记录带有函数原型的typedef:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM)hjhhubj)}(hX/** * typedef 类型名称 - 简短描述. * @参数1: 参数1的描述 * @参数2: 参数2的描述 * * 类型描述. * * Context: 锁(Locking)上下文. * Return: 返回值的意义. */ typedef void (*类型名称)(struct v4l2_ctrl *参数1, void *参数2);h]hX/** * typedef 类型名称 - 简短描述. * @参数1: 参数1的描述 * @参数2: 参数2的描述 * * 类型描述. * * Context: 锁(Locking)上下文. * Return: 返回值的意义. */ typedef void (*类型名称)(struct v4l2_ctrl *参数1, void *参数2);}hjsbah}(h]h ]h"]h$]h&]jjuh1jhhhM+hjhhubeh}(h]typedefah ]h"] typedef文档ah$]h&]uh1jDhjFhhhhhMubjE)}(hhh](jJ)}(h高亮与交叉引用h]h高亮与交叉引用}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jIhjhhhhhM8ubh)}(h在kernel-doc注释的描述文本中可以识别以下特殊模式,并将其转换为正确的 reStructuredText标记和 `Sphinx C 域`_ 引用。h](h|在kernel-doc注释的描述文本中可以识别以下特殊模式,并将其转换为正确的 reStructuredText标记和 }(hjhhhNhNubj)}(h`Sphinx C 域`_h]h Sphinx C 域}(hj'hhhNhNubah}(h]h ]h"]h$]h&]name Sphinx C 域jjuh1jhjjKubh 引用。}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhM:hjhhubh attention)}(ho以下内容 **仅** 在kernel-doc注释中识别, **不会** 在普通的 reStructuredText文档中识别。h]h)}(ho以下内容 **仅** 在kernel-doc注释中识别, **不会** 在普通的 reStructuredText文档中识别。h](h 以下内容 }(hjGhhhNhNubhstrong)}(h**仅**h]h仅}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1jOhjGubh! 在kernel-doc注释中识别, }(hjGhhhNhNubjP)}(h **不会**h]h不会}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1jOhjGubh0 在普通的 reStructuredText文档中识别。}(hjGhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhM=hjCubah}(h]h ]h"]h$]h&]uh1jAhjhhhhhNubhdefinition_list)}(hhh](hdefinition_list_item)}(h``funcname()`` 函数引用。 h](hterm)}(h``funcname()``h]j)}(hjh]h funcname()}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhhhMAhjubh definition)}(hhh]h)}(h函数引用。h]h函数引用。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMAhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhhhMAhjubj)}(hL``@parameter`` 函数参数的名称(未交叉引用,仅格式化)。 h](j)}(h``@parameter``h]j)}(hjh]h @parameter}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhhhMDhjubj)}(hhh]h)}(h<函数参数的名称(未交叉引用,仅格式化)。h]h<函数参数的名称(未交叉引用,仅格式化)。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMDhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhhhMDhjhhubj)}(hB``%CONST`` 常量的名称(未交叉引用,仅格式化)。 h](j)}(h ``%CONST``h]j)}(hj h]h%CONST}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jhhhMGhjubj)}(hhh]h)}(h6常量的名称(未交叉引用,仅格式化)。h]h6常量的名称(未交叉引用,仅格式化)。}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMGhj ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhhhMGhjhhubj)}(hX````literal```` 预格式化文本块。输出将使用等距字体。 若你需要使用在kernel-doc脚本或reStructuredText中有特殊含义的字符,则此功能 非常有用。 若你需要在函数描述中使用类似于 ``%ph`` 的东西,这特别有用。 h](j)}(h````literal````h]j)}(hj: h]h ``literal``}(hj< hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj8 ubah}(h]h ]h"]h$]h&]uh1jhhhMOhj4 ubj)}(hhh](h)}(h6预格式化文本块。输出将使用等距字体。h]h6预格式化文本块。输出将使用等距字体。}(hjR hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMJhjO ubh)}(hr若你需要使用在kernel-doc脚本或reStructuredText中有特殊含义的字符,则此功能 非常有用。h]hr若你需要使用在kernel-doc脚本或reStructuredText中有特殊含义的字符,则此功能 非常有用。}(hj` hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMLhjO ubh)}(hT若你需要在函数描述中使用类似于 ``%ph`` 的东西,这特别有用。h](h.若你需要在函数描述中使用类似于 }(hjn hhhNhNubj)}(h``%ph``h]h%ph}(hjv hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjn ubh 的东西,这特别有用。}(hjn hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMOhjO ubeh}(h]h ]h"]h$]h&]uh1jhj4 ubeh}(h]h ]h"]h$]h&]uh1jhhhMOhjhhubj)}(hF``$ENVVAR`` 环境变量名称(未交叉引用,仅格式化)。 h](j)}(h ``$ENVVAR``h]j)}(hj h]h$ENVVAR}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jhhhMRhj ubj)}(hhh]h)}(h9环境变量名称(未交叉引用,仅格式化)。h]h9环境变量名称(未交叉引用,仅格式化)。}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMRhj ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhhhMRhjhhubj)}(h$``&struct name`` 结构体引用。 h](j)}(h``&struct name``h]j)}(hj h]h &struct name}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jhhhMUhj ubj)}(hhh]h)}(h结构体引用。h]h结构体引用。}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMUhj ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhhhMUhjhhubj)}(h``&enum name`` 枚举引用。 h](j)}(h``&enum name``h]j)}(hj h]h &enum name}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jhhhMXhj ubj)}(hhh]h)}(h枚举引用。h]h枚举引用。}(hj( hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMXhj% ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhhhMXhjhhubj)}(h#``&typedef name`` Typedef引用。 h](j)}(h``&typedef name``h]j)}(hjH h]h &typedef name}(hjJ hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjF ubah}(h]h ]h"]h$]h&]uh1jhhhM[hjB ubj)}(hhh]h)}(hTypedef引用。h]hTypedef引用。}(hj` hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM[hj] ubah}(h]h ]h"]h$]h&]uh1jhjB ubeh}(h]h ]h"]h$]h&]uh1jhhhM[hjhhubj)}(h``&struct_name->member`` or ``&struct_name.member`` 结构体或共用体成员引用。交叉引用将链接到结构体或共用体定义,而不是直接到成员。 h](j)}(h3``&struct_name->member`` or ``&struct_name.member``h](j)}(h``&struct_name->member``h]h&struct_name->member}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj~ ubh or }(hj~ hhhNhNubj)}(h``&struct_name.member``h]h&struct_name.member}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj~ ubeh}(h]h ]h"]h$]h&]uh1jhhhM^hjz ubj)}(hhh]h)}(hu结构体或共用体成员引用。交叉引用将链接到结构体或共用体定义,而不是直接到成员。h]hu结构体或共用体成员引用。交叉引用将链接到结构体或共用体定义,而不是直接到成员。}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM^hj ubah}(h]h ]h"]h$]h&]uh1jhjz ubeh}(h]h ]h"]h$]h&]uh1jhhhM^hjhhubj)}(hz``&name`` 泛类型引用。请首选上面描述的完整引用方式。此法主要是为了可能未描述的注释。 h](j)}(h ``&name``h]j)}(hj h]h&name}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jhhhMahj ubj)}(hhh]h)}(ho泛类型引用。请首选上面描述的完整引用方式。此法主要是为了可能未描述的注释。h]ho泛类型引用。请首选上面描述的完整引用方式。此法主要是为了可能未描述的注释。}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMahj ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhhhMahjhhubeh}(h]h ]h"]h$]h&]uh1jhjhhhhhNubjE)}(hhh](jJ)}(h从reStructuredText交叉引用h]h从reStructuredText交叉引用}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jIhj hhhhhMdubh)}(h无需额外的语法来从reStructuredText文档交叉引用kernel-do注释中定义的函数和类型。 只需以 ``()`` 结束函数名,并在类型之前写上 ``struct`` , ``union`` , ``enum`` 或 ``typedef`` 。 例如::h](hu无需额外的语法来从reStructuredText文档交叉引用kernel-do注释中定义的函数和类型。 只需以 }(hj hhhNhNubj)}(h``()``h]h()}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh, 结束函数名,并在类型之前写上 }(hj hhhNhNubj)}(h ``struct``h]hstruct}(hj. hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh , }(hj hhhNhNubj)}(h ``union``h]hunion}(hj@ hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh , }hj sbj)}(h``enum``h]henum}(hjR hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh 或 }(hj hhhNhNubj)}(h ``typedef``h]htypedef}(hjd hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh 。 例如:}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMfhj hhubj)}(hHSee foo(). See struct foo. See union bar. See enum baz. See typedef meh.h]hHSee foo(). See struct foo. See union bar. See enum baz. See typedef meh.}hj| sbah}(h]h ]h"]h$]h&]jjuh1jhhhMkhj hhubh)}(hV若要在交叉引用链接中使用自定义文本,可以通过以下语法进行::h]hU若要在交叉引用链接中使用自定义文本,可以通过以下语法进行:}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMqhj hhubj)}(hqSee :c:func:`my custom link text for function foo `. See :c:type:`my custom link text for struct bar `.h]hqSee :c:func:`my custom link text for function foo `. See :c:type:`my custom link text for struct bar `.}hj sbah}(h]h ]h"]h$]h&]jjuh1jhhhMshj hhubh)}(h>有关更多详细信息,请参阅 `Sphinx C 域`_ 文档。h](h%有关更多详细信息,请参阅 }(hj hhhNhNubj)}(h`Sphinx C 域`_h]h Sphinx C 域}(hj hhhNhNubah}(h]h ]h"]h$]h&]name Sphinx C 域jjuh1jhj jKubh 文档。}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMvhj hhubeh}(h]restructuredtextah ]h"]从restructuredtext交叉引用ah$]h&]uh1jDhjhhhhhMdubeh}(h]id10ah ]h"]高亮与交叉引用ah$]h&]uh1jDhjFhhhhhM8ubjE)}(hhh](jJ)}(h总述性文档注释h]h总述性文档注释}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jIhj hhhhhMyubh)}(h为了促进源代码和注释紧密联合,可以将kernel-doc文档块作为自由形式的注释,而 不是函数、结构、联合、枚举或typedef的绑定kernel-doc。例如,这可以用于解释 驱动程序或库代码的操作理论。h]h为了促进源代码和注释紧密联合,可以将kernel-doc文档块作为自由形式的注释,而 不是函数、结构、联合、枚举或typedef的绑定kernel-doc。例如,这可以用于解释 驱动程序或库代码的操作理论。}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM{hj hhubh)}(hI这是通过使用带有节标题的 ``DOC:`` 节关键字来实现的。h](h%这是通过使用带有节标题的 }(hj hhhNhNubj)}(h``DOC:``h]hDOC:}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh 节关键字来实现的。}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMhj hhubh)}(h2总述或高层级文档注释的一般格式为::h]h1总述或高层级文档注释的一般格式为:}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj hhubj)}(hX7/** * DOC: Theory of Operation * * The whizbang foobar is a dilly of a gizmo. It can do whatever you * want it to do, at any time. It reads your mind. Here's how it works. * * foo bar splat * * The only drawback to this gizmo is that is can sometimes damage * hardware, software, or its subject(s). */h]hX7/** * DOC: Theory of Operation * * The whizbang foobar is a dilly of a gizmo. It can do whatever you * want it to do, at any time. It reads your mind. Here's how it works. * * foo bar splat * * The only drawback to this gizmo is that is can sometimes damage * hardware, software, or its subject(s). */}hj% sbah}(h]h ]h"]h$]h&]jjuh1jhhhMhj hhubh)}(h``DOC:`` 后面的标题用作源文件中的标题,但也用作提取文档注释的标识符。因此, 文件中的标题必须是唯一的。h](j)}(h``DOC:``h]hDOC:}(hj7 hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj3 ubh 后面的标题用作源文件中的标题,但也用作提取文档注释的标识符。因此, 文件中的标题必须是唯一的。}(hj3 hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMhj hhubeh}(h]id11ah ]h"]总述性文档注释ah$]h&]uh1jDhjFhhhhhMyubeh}(h] kernel-docah ]h"]编写kernel-doc注释ah$]h&]uh1jDhhhhhhhKubjE)}(hhh](jJ)}(h包含kernel-doc注释h]h包含kernel-doc注释}(hjb hhhNhNubah}(h]h ]h"]h$]h&]uh1jIhj_ hhhhhMubh)}(hm文档注释可以被包含在任何使用专用kernel-doc Sphinx指令扩展的reStructuredText 文档中。h]hm文档注释可以被包含在任何使用专用kernel-doc Sphinx指令扩展的reStructuredText 文档中。}(hjp hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj_ hhubh)}(h!kernel-doc指令的格式如下::h]h kernel-doc指令的格式如下:}(hj~ hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj_ hhubj)}(h".. kernel-doc:: source :option:h]h".. kernel-doc:: source :option:}hj sbah}(h]h ]h"]h$]h&]jjuh1jhhhMhj_ hhubh)}(hX*source* 是相对于内核源代码树的源文件路径。 支持以下指令选项:h](jy)}(h*source*h]hsource}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jxhj ubhP 是相对于内核源代码树的源文件路径。 支持以下指令选项:}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMhj_ hhubj)}(hhh](j)}(hXexport: *[source-pattern ...]* 包括 *source* 中使用 ``EXPORT_SYMBOL`` 或 ``EXPORT_SYMBOL_GPL`` 导出的所有 函数的文档,无论是在 *source* 中还是在 *source-pattern* 指定的任何文件中。 当kernel-doc注释被放置在头文件中,而 ``EXPORT_SYMBOL`` 和 ``EXPORT_SYMBOL_GPL`` 位于函数定义旁边时, *source-pattern* 非常有用。 例子:: .. kernel-doc:: lib/bitmap.c :export: .. kernel-doc:: include/net/mac80211.h :export: net/mac80211/*.c h](j)}(hexport: *[source-pattern ...]*h](hexport: }(hj hhhNhNubjy)}(h*[source-pattern ...]*h]h[source-pattern ...]}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jxhj ubeh}(h]h ]h"]h$]h&]uh1jhhhMhj ubj)}(hhh](h)}(h包括 *source* 中使用 ``EXPORT_SYMBOL`` 或 ``EXPORT_SYMBOL_GPL`` 导出的所有 函数的文档,无论是在 *source* 中还是在 *source-pattern* 指定的任何文件中。h](h包括 }(hj hhhNhNubjy)}(h*source*h]hsource}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jxhj ubh 中使用 }(hj hhhNhNubj)}(h``EXPORT_SYMBOL``h]h EXPORT_SYMBOL}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh 或 }(hj hhhNhNubj)}(h``EXPORT_SYMBOL_GPL``h]hEXPORT_SYMBOL_GPL}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh0 导出的所有 函数的文档,无论是在 }(hj hhhNhNubjy)}(h*source*h]hsource}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jxhj ubh 中还是在 }(hj hhhNhNubjy)}(h*source-pattern*h]hsource-pattern}(hj, hhhNhNubah}(h]h ]h"]h$]h&]uh1jxhj ubh 指定的任何文件中。}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMhj ubh)}(h当kernel-doc注释被放置在头文件中,而 ``EXPORT_SYMBOL`` 和 ``EXPORT_SYMBOL_GPL`` 位于函数定义旁边时, *source-pattern* 非常有用。h](h2当kernel-doc注释被放置在头文件中,而 }(hjD hhhNhNubj)}(h``EXPORT_SYMBOL``h]h EXPORT_SYMBOL}(hjL hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjD ubh 和 }(hjD hhhNhNubj)}(h``EXPORT_SYMBOL_GPL``h]hEXPORT_SYMBOL_GPL}(hj^ hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjD ubh 位于函数定义旁边时, }(hjD hhhNhNubjy)}(h*source-pattern*h]hsource-pattern}(hjp hhhNhNubah}(h]h ]h"]h$]h&]uh1jxhjD ubh 非常有用。}(hjD hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMhj ubh)}(h例子::h]h例子:}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj ubj)}(hm.. kernel-doc:: lib/bitmap.c :export: .. kernel-doc:: include/net/mac80211.h :export: net/mac80211/*.ch]hm.. kernel-doc:: lib/bitmap.c :export: .. kernel-doc:: include/net/mac80211.h :export: net/mac80211/*.c}hj sbah}(h]h ]h"]h$]h&]jjuh1jhhhMhj ubeh}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhhhMhj ubj)}(hXinternal: *[source-pattern ...]* 包括 *source* 中所有在 *source* 或 *source-pattern* 的任何文件中都没有使用 ``EXPORT_SYMBOL`` 或 ``EXPORT_SYMBOL_GPL`` 导出的函数和类型的文档。 例子:: .. kernel-doc:: drivers/gpu/drm/i915/intel_audio.c :internal: h](j)}(h internal: *[source-pattern ...]*h](h internal: }(hj hhhNhNubjy)}(h*[source-pattern ...]*h]h[source-pattern ...]}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jxhj ubeh}(h]h ]h"]h$]h&]uh1jhhhMhj ubj)}(hhh](h)}(h包括 *source* 中所有在 *source* 或 *source-pattern* 的任何文件中都没有使用 ``EXPORT_SYMBOL`` 或 ``EXPORT_SYMBOL_GPL`` 导出的函数和类型的文档。h](h包括 }(hj hhhNhNubjy)}(h*source*h]hsource}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jxhj ubh 中所有在 }(hj hhhNhNubjy)}(h*source*h]hsource}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jxhj ubh 或 }(hj hhhNhNubjy)}(h*source-pattern*h]hsource-pattern}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jxhj ubh# 的任何文件中都没有使用 }(hj hhhNhNubj)}(h``EXPORT_SYMBOL``h]h EXPORT_SYMBOL}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh 或 }hj sbj)}(h``EXPORT_SYMBOL_GPL``h]hEXPORT_SYMBOL_GPL}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh% 导出的函数和类型的文档。}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMhj ubh)}(h例子::h]h例子:}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj ubj)}(h@.. kernel-doc:: drivers/gpu/drm/i915/intel_audio.c :internal:h]h@.. kernel-doc:: drivers/gpu/drm/i915/intel_audio.c :internal:}hjIsbah}(h]h ]h"]h$]h&]jjuh1jhhhMhj ubeh}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhhhMhj hhubj)}(hX]identifiers: *[ function/type ...]* 在 *source* 中包含每个 *function* 和 *type* 的文档。如果没有指定 *function* , 则 *source* 中所有函数和类型的文档都将包含在内。 例子:: .. kernel-doc:: lib/bitmap.c :identifiers: bitmap_parselist bitmap_parselist_user .. kernel-doc:: lib/idr.c :identifiers: h](j)}(h#identifiers: *[ function/type ...]*h](h identifiers: }(hjghhhNhNubjy)}(h*[ function/type ...]*h]h[ function/type ...]}(hjohhhNhNubah}(h]h ]h"]h$]h&]uh1jxhjgubeh}(h]h ]h"]h$]h&]uh1jhhhMhjcubj)}(hhh](h)}(h在 *source* 中包含每个 *function* 和 *type* 的文档。如果没有指定 *function* , 则 *source* 中所有函数和类型的文档都将包含在内。h](h在 }(hjhhhNhNubjy)}(h*source*h]hsource}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jxhjubh 中包含每个 }(hjhhhNhNubjy)}(h *function*h]hfunction}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jxhjubh 和 }(hjhhhNhNubjy)}(h*type*h]htype}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jxhjubh 的文档。如果没有指定 }(hjhhhNhNubjy)}(h *function*h]hfunction}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jxhjubh , 则 }(hjhhhNhNubjy)}(h*source*h]hsource}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jxhjubh7 中所有函数和类型的文档都将包含在内。}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMhjubh)}(h例子::h]h例子:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubj)}(h.. kernel-doc:: lib/bitmap.c :identifiers: bitmap_parselist bitmap_parselist_user .. kernel-doc:: lib/idr.c :identifiers:h]h.. kernel-doc:: lib/bitmap.c :identifiers: bitmap_parselist bitmap_parselist_user .. kernel-doc:: lib/idr.c :identifiers:}hjsbah}(h]h ]h"]h$]h&]jjuh1jhhhMhjubeh}(h]h ]h"]h$]h&]uh1jhjcubeh}(h]h ]h"]h$]h&]uh1jhhhMhj hhubj)}(hno-identifiers: *[ function/type ...]* 排除 *source* 中所有 *function* 和 *type* 的文档。 例子:: .. kernel-doc:: lib/bitmap.c :no-identifiers: bitmap_parselist h](j)}(h&no-identifiers: *[ function/type ...]*h](hno-identifiers: }(hjhhhNhNubjy)}(h*[ function/type ...]*h]h[ function/type ...]}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1jxhjubeh}(h]h ]h"]h$]h&]uh1jhhhMhjubj)}(hhh](h)}(h<排除 *source* 中所有 *function* 和 *type* 的文档。h](h排除 }(hj9hhhNhNubjy)}(h*source*h]hsource}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1jxhj9ubh 中所有 }(hj9hhhNhNubjy)}(h *function*h]hfunction}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1jxhj9ubh 和 }(hj9hhhNhNubjy)}(h*type*h]htype}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1jxhj9ubh 的文档。}(hj9hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMhj6ubh)}(h例子::h]h例子:}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj6ubj)}(hA.. kernel-doc:: lib/bitmap.c :no-identifiers: bitmap_parselisth]hA.. kernel-doc:: lib/bitmap.c :no-identifiers: bitmap_parselist}hjsbah}(h]h ]h"]h$]h&]jjuh1jhhhMhj6ubeh}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhhhMhj hhubj)}(hXfunctions: *[ function/type ...]* 这是“identifiers”指令的别名,已弃用。 h](j)}(h!functions: *[ function/type ...]*h](h functions: }(hjhhhNhNubjy)}(h*[ function/type ...]*h]h[ function/type ...]}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jxhjubeh}(h]h ]h"]h$]h&]uh1jhhhMhjubj)}(hhh]h)}(h5这是“identifiers”指令的别名,已弃用。h]h5这是“identifiers”指令的别名,已弃用。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhhhMhj hhubj)}(hXdoc: *title* 包含 *source* 中由 *title* 标题标识的 ``DOC:`` 文档段落。 *title* 中允许 空格;不要在 *title* 上加引号。 *title* 仅用作段落的标识符,不包含在输出中。 请确保在所附的reStructuredText文档中有适当的标题。 例子:: .. kernel-doc:: drivers/gpu/drm/i915/intel_audio.c :doc: High Definition Audio over HDMI and Display Port h](j)}(h doc: *title*h](hdoc: }(hjhhhNhNubjy)}(h*title*h]htitle}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jxhjubeh}(h]h ]h"]h$]h&]uh1jhhhMhjubj)}(hhh](h)}(hX 包含 *source* 中由 *title* 标题标识的 ``DOC:`` 文档段落。 *title* 中允许 空格;不要在 *title* 上加引号。 *title* 仅用作段落的标识符,不包含在输出中。 请确保在所附的reStructuredText文档中有适当的标题。h](h包含 }(hjhhhNhNubjy)}(h*source*h]hsource}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jxhjubh 中由 }(hjhhhNhNubjy)}(h*title*h]htitle}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jxhjubh 标题标识的 }(hjhhhNhNubj)}(h``DOC:``h]hDOC:}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh 文档段落。 }(hjhhhNhNubjy)}(h*title*h]htitle}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1jxhjubh 中允许 空格;不要在 }(hjhhhNhNubjy)}(h*title*h]htitle}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1jxhjubh 上加引号。 }(hjhhhNhNubjy)}(h*title*h]htitle}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1jxhjubh| 仅用作段落的标识符,不包含在输出中。 请确保在所附的reStructuredText文档中有适当的标题。}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMhjubh)}(h例子::h]h例子:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjubj)}(hl.. kernel-doc:: drivers/gpu/drm/i915/intel_audio.c :doc: High Definition Audio over HDMI and Display Porth]hl.. kernel-doc:: drivers/gpu/drm/i915/intel_audio.c :doc: High Definition Audio over HDMI and Display Port}hjsbah}(h]h ]h"]h$]h&]jjuh1jhhhMhjubeh}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhhhMhj hhubeh}(h]h ]h"]h$]h&]uh1jhj_ hhhhhNubh)}(hR如果没有选项,kernel-doc指令将包含源文件中的所有文档注释。h]hR如果没有选项,kernel-doc指令将包含源文件中的所有文档注释。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj_ hhubh)}(hkernel-doc扩展包含在内核源代码树中,位于 ``Documentation/sphinx/kerneldoc.py`` 。 在内部,它使用 ``scripts/kernel-doc`` 脚本从源代码中提取文档注释。h](h8kernel-doc扩展包含在内核源代码树中,位于 }(hjhhhNhNubj)}(h%``Documentation/sphinx/kerneldoc.py``h]h!Documentation/sphinx/kerneldoc.py}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh 。 在内部,它使用 }(hjhhhNhNubj)}(h``scripts/kernel-doc``h]hscripts/kernel-doc}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh+ 脚本从源代码中提取文档注释。}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMhj_ hhubj)}(h.. _kernel_doc_zh:h]h}(h]h ]h"]h$]h&]refid kernel-doc-zhuh1jhMhj_ hhhhubjE)}(hhh](jJ)}(h.如何使用kernel-doc生成手册(man)页h]h.如何使用kernel-doc生成手册(man)页}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jIhjhhhhhMubh)}(hQ如果您只想使用kernel-doc生成手册页,可以从内核git树这样做::h]hP如果您只想使用kernel-doc生成手册页,可以从内核git树这样做:}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjhhubj)}(hs$ scripts/kernel-doc -man \ $(git grep -l '/\*\*' -- :^Documentation :^tools) \ | scripts/split-man.pl /tmp/manh]hs$ scripts/kernel-doc -man \ $(git grep -l '/\*\*' -- :^Documentation :^tools) \ | scripts/split-man.pl /tmp/man}hjsbah}(h]h ]h"]h$]h&]jjuh1jhhhMhjhhubh)}(hr一些旧版本的git不支持路径排除语法的某些变体。 以下命令之一可能适用于这些版本::h]hq一些旧版本的git不支持路径排除语法的某些变体。 以下命令之一可能适用于这些版本:}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjhhubj)}(hX$ scripts/kernel-doc -man \ $(git grep -l '/\*\*' -- . ':!Documentation' ':!tools') \ | scripts/split-man.pl /tmp/man $ scripts/kernel-doc -man \ $(git grep -l '/\*\*' -- . ":(exclude)Documentation" ":(exclude)tools") \ | scripts/split-man.pl /tmp/manh]hX$ scripts/kernel-doc -man \ $(git grep -l '/\*\*' -- . ':!Documentation' ':!tools') \ | scripts/split-man.pl /tmp/man $ scripts/kernel-doc -man \ $(git grep -l '/\*\*' -- . ":(exclude)Documentation" ":(exclude)tools") \ | scripts/split-man.pl /tmp/man}hj4sbah}(h]h ]h"]h$]h&]jjuh1jhhhMhjhhubeh}(h](kernel-doc-manjeh ]h"](.如何使用kernel-doc生成手册(man)页 kernel_doc_zheh$]h&]uh1jDhj_ hhhhhMexpect_referenced_by_name}jHjsexpect_referenced_by_id}jjsubeh}(h]id12ah ]h"]包含kernel-doc注释ah$]h&]uh1jDhhhhhhhMubeh}(h]h ]h"]h$]h&]sourcehuh1hcurrent_sourceN current_lineNsettingsdocutils.frontendValues)}(jIN generatorN datestampN source_linkN source_urlN toc_backlinksentryfootnote_backlinksK sectnum_xformKstrip_commentsNstrip_elements_with_classesN strip_classesN report_levelK halt_levelKexit_status_levelKdebugNwarning_streamN tracebackinput_encoding utf-8-siginput_encoding_error_handlerstrictoutput_encodingutf-8output_encoding_error_handlerjzerror_encodingutf-8error_encoding_error_handlerbackslashreplace language_codeenrecord_dependenciesNconfigN id_prefixhauto_id_prefixid dump_settingsNdump_internalsNdump_transformsNdump_pseudo_xmlNexpose_internalsNstrict_visitorN_disable_configN_sourceh، _destinationN _config_files]7/var/lib/git/docbuild/linux/Documentation/docutils.confafile_insertion_enabled raw_enabledKline_length_limitM'pep_referencesN pep_base_urlhttps://peps.python.org/pep_file_url_templatepep-%04drfc_referencesN rfc_base_url&https://datatracker.ietf.org/doc/html/ tab_widthKtrim_footnote_reference_spacesyntax_highlightlong smart_quotessmartquotes_locales]character_level_inline_markupdoctitle_xform docinfo_xformKsectsubtitle_xform image_loadinglinkembed_stylesheetcloak_email_addressessection_self_linkenvNubreporterNindirect_targets]substitution_defs}substitution_names}refnames} sphinx c 域](jj'j esrefids}j]jasnameids}(j\ jY jjjjjjjjj-j*j j jjjjjYjVjjj jj j j j jT jQ jTjQjHjjGjDu nametypes}(j\ jjjjj-j jjjYjj j j jT jTjHjGuh}(jY jFjjjj0jjjj$j*jj j0jjjjjVjjj\jjj jj j jQ j jQj_ jjjDju footnote_refs} citation_refs} autofootnotes]autofootnote_refs]symbol_footnotes]symbol_footnote_refs] footnotes] citations]autofootnote_startKsymbol_footnote_startK id_counter collectionsCounter}jK sRparse_messages]transform_messages]hsystem_message)}(hhh]h)}(hhh]h3Hyperlink target "kernel-doc-zh" is not referenced.}hjsbah}(h]h ]h"]h$]h&]uh1hhjubah}(h]h ]h"]h$]h&]levelKtypeINFOsourceh،lineMuh1juba transformerN include_log]9Documentation/translations/zh_CN/doc-guide/kernel-doc.rst(NNNNta decorationNhhub.