9sphinx.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]hPortuguese (Brazilian)}hhsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget(/translations/pt_BR/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译者}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hhhKubh)}(h*吴想成 Wu XiangCheng h]h)}(h)吴想成 Wu XiangCheng h](h吴想成 Wu XiangCheng <}(hj"hhhNhNubh reference)}(hbobwxc@email.cnh]hbobwxc@email.cn}(hj,hhhNhNubah}(h]h ]h"]h$]h&]refurimailto:bobwxc@email.cnuh1j*hj"ubh>}(hj"hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1hhj ubeh}(h]h ]h"]h$]h&]uh1hhhhKhhhhubeh}(h]h ]h"]h$]h&]uh1hhhhhhhhKubhsection)}(hhh](htitle)}(h编写kernel-doc注释h]h编写kernel-doc注释}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1j]hjZhhhhhKubh)}(hLinux内核源文件可以包含kernel-doc格式的结构化文档注释,用以描述代码的函数、 类型和设计。将文档嵌入源文件更容易保持文档最新。h]hLinux内核源文件可以包含kernel-doc格式的结构化文档注释,用以描述代码的函数、 类型和设计。将文档嵌入源文件更容易保持文档最新。}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK hjZhhubh)}(h内核文档格式与javadoc、gtk-doc或Doxygen看似很相似,但由于历史原因, 实际有着明显的不同。内核源包含成千上万个kernel-doc注释。请坚持遵循 此处描述的风格。h]h)}(h内核文档格式与javadoc、gtk-doc或Doxygen看似很相似,但由于历史原因, 实际有着明显的不同。内核源包含成千上万个kernel-doc注释。请坚持遵循 此处描述的风格。h]h内核文档格式与javadoc、gtk-doc或Doxygen看似很相似,但由于历史原因, 实际有着明显的不同。内核源包含成千上万个kernel-doc注释。请坚持遵循 此处描述的风格。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK hj{ubah}(h]h ]h"]h$]h&]uh1hhjZhhhhhNubh)}(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&]uh1hhjZhhhhhNubh)}(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.htmluh1j*hjresolvedKubh 函数和带有锚点的 类型描述。这些注释将被过滤以生成特殊kernel-doc高亮和交叉引用。详见下文。}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjZhhubhtarget)}(hB.. _Sphinx C 域: http://www.sphinx-doc.org/en/stable/domains.htmlh]h}(h]sphinx-cah ]h"] sphinx c 域ah$]h&]jjuh1jhK!hjZhhhh 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&]uh1hhhhKhjZhhubh)}(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}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh )程序提供kernel-doc 格式的文档,以确保内核源代码布局的一致性。此建议优先级较低,由内核源文件的 维护者自行决定。}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjZhhubjY)}(hhh](j^)}(h如何格式化kernel-doc注释h]h如何格式化kernel-doc注释}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1j]hjDhhhhhK"ubh)}(hkernel-doc注释用 ``/**`` 作为开始标记。 ``kernel-doc`` 工具将提取以这种方式 标记的注释。注释其余部分的格式类似于一个普通的多行注释,左侧有一列星号,以 ``*/`` 行结束。h](hkernel-doc注释用 }(hjUhhhNhNubj)}(h``/**``h]h/**}(hj]hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjUubh 作为开始标记。 }(hjUhhhNhNubj)}(h``kernel-doc``h]h kernel-doc}(hjohhhNhNubah}(h]h ]h"]h$]h&]uh1jhjUubh 工具将提取以这种方式 标记的注释。注释其余部分的格式类似于一个普通的多行注释,左侧有一列星号,以 }(hjUhhhNhNubj)}(h``*/``h]h*/}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjUubh 行结束。}(hjUhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK$hjDhhubh)}(h函数和类型的kernel-doc注释应该放在所描述的函数或类型之前,以便最大限度地提高 更改代码的人同时更改文档的可能性。概述kernel-doc注释可以放在最顶部的任何地方。h]h函数和类型的kernel-doc注释应该放在所描述的函数或类型之前,以便最大限度地提高 更改代码的人同时更改文档的可能性。概述kernel-doc注释可以放在最顶部的任何地方。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK(hjDhhubh)}(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+hjDhhubh literal_block)}(h0tools/docs/kernel-doc -v -none drivers/foo/bar.ch]h0tools/docs/kernel-doc -v -none drivers/foo/bar.c}hjsbah}(h]h ]h"]h$]h&] xml:spacepreserveuh1jhhhK.hjDhhubh)}(hJ当请求执行额外的gcc检查时,内核构建将验证文档格式::h]hI当请求执行额外的gcc检查时,内核构建将验证文档格式:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK0hjDhhubj)}(hmake W=nh]hmake W=n}hjsbah}(h]h ]h"]h$]h&]jjuh1jhhhK2hjDhhubeh}(h]id1ah ]h"]如何格式化kernel-doc注释ah$]h&]uh1jXhjZhhhhhK"ubjY)}(hhh](j^)}(h 函数文档h]h 函数文档}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j]hjhhhhhK5ubh)}(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函数名后面的简短描述可以跨多行,并以参数描述、空注释行或注释块结尾结束。}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKMhjhhubjY)}(hhh](j^)}(h 函数参数h]h 函数参数}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1j]hj8hhhhhKPubh)}(h每个函数参数都应该按照顺序描述,紧跟在函数简要说明之后。不要在函数描述和参数 之间,也不要在参数之间留空。h]h每个函数参数都应该按照顺序描述,紧跟在函数简要说明之后。不要在函数描述和参数 之间,也不要在参数之间留空。}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKRhj8hhubh)}(h,每个 ``@参数:`` 描述可以跨多行。h](h每个 }(hjWhhhNhNubj)}(h ``@参数:``h]h@参数:}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjWubh 描述可以跨多行。}(hjWhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKUhj8hhubh)}(h如果 ``@参数`` 描述有多行,则说明的续行应该从上一行的同一列开始:: * @参数: 较长说明 * 的续行 或:: * @参数: * 较长说明 * 的续行h](h)}(h]如果 ``@参数`` 描述有多行,则说明的续行应该从上一行的同一列开始::h](h如果 }(hj{hhhNhNubj)}(h ``@参数``h]h@参数}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj{ubhJ 描述有多行,则说明的续行应该从上一行的同一列开始:}(hj{hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKYhjwubj)}(h** @参数: 较长说明 * 的续行h]h** @参数: 较长说明 * 的续行}hjsbah}(h]h ]h"]h$]h&]jjuh1jhhhK[hjwubh)}(h或::h]h或:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK^hjwubj)}(h5* @参数: * 较长说明 * 的续行h]h5* @参数: * 较长说明 * 的续行}hjsbah}(h]h ]h"]h$]h&]jjuh1jhhhK`hjwubeh}(h]h ]h"]h$]h&]uh1hhj8hhhhhNubh)}(hQ如果函数的参数数目可变,则需用kernel-doc格式对其进行描述::h]hP如果函数的参数数目可变,则需用kernel-doc格式对其进行描述:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKdhj8hhubj)}(h* @...: 描述h]h* @...: 描述}hjsbah}(h]h ]h"]h$]h&]jjuh1jhhhKfhj8hhubeh}(h]id3ah ]h"] 函数参数ah$]h&]uh1jXhjhhhhhKPubjY)}(hhh](j^)}(h函数上下文h]h函数上下文}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j]hjhhhhhKiubh)}(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.}hj.sbah}(h]h ]h"]h$]h&]jjuh1jhhhKqhjhhubeh}(h]id4ah ]h"]函数上下文ah$]h&]uh1jXhjhhhhhKiubjY)}(hhh](j^)}(h 返回值h]h 返回值}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1j]hjDhhhhhKzubh)}(h3如有返回值,应在 ``Return`` 节中描述。h](h如有返回值,应在 }(hjUhhhNhNubj)}(h ``Return``h]hReturn}(hj]hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjUubh 节中描述。}(hjUhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK|hjDhhubh)}(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您提供的多行描述文本 }(hjhhhNhNubhemphasis)}(h*不会*h]h不会}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhH 识别换行符,因此如果您想将某些文本预格式化, 如:}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjubj)}(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&]jjuh1jhhhKhjubh)}(h&它们在最终文档中变成一行::h]h%它们在最终文档中变成一行:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubj)}(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&]jjuh1jhhhKhjubh)}(hN因此,为了在需要的地方换行,您需要使用ReST列表,例如::h]hM因此,为了在需要的地方换行,您需要使用ReST列表,例如:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubj)}(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&]jjuh1jhhhKhjubeh}(h]h ]h"]h$]h&]uh1j~hj{ubj)}(h如果您提供的描述性文本中的行以某个后跟冒号的短语开头,则每一个这种短语 都将被视为新的节标题,可能会产生意料不到的效果。h]h)}(h如果您提供的描述性文本中的行以某个后跟冒号的短语开头,则每一个这种短语 都将被视为新的节标题,可能会产生意料不到的效果。h]h如果您提供的描述性文本中的行以某个后跟冒号的短语开头,则每一个这种短语 都将被视为新的节标题,可能会产生意料不到的效果。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1j~hj{ubeh}(h]h ]h"]h$]h&]enumtypearabicprefixhsuffix)uh1jyhjuubah}(h]h ]h"]h$]h&]uh1hhjDhhhNhNubeh}(h]id5ah ]h"] 返回值ah$]h&]uh1jXhjhhhhhKzubeh}(h]id2ah ]h"] 函数文档ah$]h&]uh1jXhjZhhhhhK5ubjY)}(hhh](j^)}(h*结构体、共用体、枚举类型文档h]h*结构体、共用体、枚举类型文档}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1j]hj+hhhhhKubh)}(hi结构体(struct)、共用体(union)、枚举(enum)类型kernel-doc注释的一般格式为::h]hh结构体(struct)、共用体(union)、枚举(enum)类型kernel-doc注释的一般格式为:}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj+hhubj)}(h/** * struct 结构体名 - 简要描述. * @成员1: 成员1描述. * @成员2: 成员2描述. * 可以为成员提供 * 多行描述. * * 结构体的描述. */h]h/** * struct 结构体名 - 简要描述. * @成员1: 成员1描述. * @成员2: 成员2描述. * 可以为成员提供 * 多行描述. * * 结构体的描述. */}hjJsbah}(h]h ]h"]h$]h&]jjuh1jhhhKhj+hhubh)}(h可以用 ``union`` 或 ``enum`` 替换上面示例中的 ``struct`` ,以描述共用体或枚举。 ``成员`` 用于表示枚举中的元素或共用体成员。h](h 可以用 }(hjXhhhNhNubj)}(h ``union``h]hunion}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjXubh 或 }(hjXhhhNhNubj)}(h``enum``h]henum}(hjrhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjXubh 替换上面示例中的 }(hjXhhhNhNubj)}(h ``struct``h]hstruct}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjXubh# ,以描述共用体或枚举。 }(hjXhhhNhNubj)}(h ``成员``h]h成员}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjXubh4 用于表示枚举中的元素或共用体成员。}(hjXhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhj+hhubh)}(hu结构体名称后面的简要说明可以跨多行,并以成员说明、空白注释行或注释块结尾结束。h]hu结构体名称后面的简要说明可以跨多行,并以成员说明、空白注释行或注释块结尾结束。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj+hhubjY)}(hhh](j^)}(h成员h]h成员}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j]hjhhhhhKubh)}(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:}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh 和 }(hjhhhNhNubj)}(h ``public:``h]hpublic:}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh 标签必须紧跟在 }(hjhhhNhNubj)}(h``/*``h]h/*}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh- 注释标记之后。可以选择是否 在 }(hjhhhNhNubj)}(h``:``h]h:}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh 和 }hjsbj)}(h``*/``h]h*/}(hjkhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh" 结束标记之间包含注释。}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjhhubh)}(h例子::h]h例子:}(hjhhhNhNubah}(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; };}hjsbah}(h]h ]h"]h$]h&]jjuh1jhhhKhjhhubeh}(h]id7ah ]h"]成员ah$]h&]uh1jXhj+hhhhhKubjY)}(hhh](j^)}(h嵌套的结构体/共用体h]h嵌套的结构体/共用体}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j]hjhhhhhKubh)}(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]jz)}(hhh](j)}(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@张三.李四:}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1j~hjubj)}(hb当嵌套结构体/共用体是匿名的时,其中的成员 ``李四`` 应记录为 ``@李四:``h]h)}(hj'h](h>当嵌套结构体/共用体是匿名的时,其中的成员 }(hj)hhhNhNubj)}(h ``李四``h]h李四}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj)ubh 应记录为 }(hj)hhhNhNubj)}(h ``@李四:``h]h@李四:}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj)ubeh}(h]h ]h"]h$]h&]uh1hhhhKhj%ubah}(h]h ]h"]h$]h&]uh1j~hjubeh}(h]h ]h"]h$]h&]jjjhjjuh1jyhjubah}(h]h ]h"]h$]h&]uh1hhjhhhNhNubeh}(h]id8ah ]h"]嵌套的结构体/共用体ah$]h&]uh1jXhj+hhhhhKubjY)}(hhh](j^)}(h行间注释文档h]h行间注释文档}(hjshhhNhNubah}(h]h ]h"]h$]h&]uh1j]hjphhhhhKubh)}(hX结构成员也可在定义时以行间注释形式记录。有两种样式,一种是单行注释,其中开始 ``/**`` 和结束 ``*/`` 位于同一行;另一种是多行注释,开头结尾各自位于一行,就 像所有其他核心文档注释一样::h](hs结构成员也可在定义时以行间注释形式记录。有两种样式,一种是单行注释,其中开始 }(hjhhhNhNubj)}(h``/**``h]h/**}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh 和结束 }(hjhhhNhNubj)}(h``*/``h]h*/}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh{ 位于同一行;另一种是多行注释,开头结尾各自位于一行,就 像所有其他核心文档注释一样:}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjphhubj)}(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&]jjuh1jhhhMhjphhubeh}(h]id9ah ]h"]行间注释文档ah$]h&]uh1jXhj+hhhhhKubeh}(h]id6ah ]h"]*结构体、共用体、枚举类型文档ah$]h&]uh1jXhjZhhhhhKubjY)}(hhh](j^)}(h Typedef文档h]h Typedef文档}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j]hjhhhhhMubh)}(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);}hj sbah}(h]h ]h"]h$]h&]jjuh1jhhhM+hjhhubeh}(h]typedefah ]h"] typedef文档ah$]h&]uh1jXhjZhhhhhMubjY)}(hhh](j^)}(h高亮与交叉引用h]h高亮与交叉引用}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1j]hj"hhhhhM8ubh)}(h在kernel-doc注释的描述文本中可以识别以下特殊模式,并将其转换为正确的 reStructuredText标记和 `Sphinx C 域`_ 引用。h](h|在kernel-doc注释的描述文本中可以识别以下特殊模式,并将其转换为正确的 reStructuredText标记和 }(hj3hhhNhNubj+)}(h`Sphinx C 域`_h]h Sphinx C 域}(hj;hhhNhNubah}(h]h ]h"]h$]h&]name Sphinx C 域jjuh1j*hj3jKubh 引用。}(hj3hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhM:hj"hhubh attention)}(ho以下内容 **仅** 在kernel-doc注释中识别, **不会** 在普通的 reStructuredText文档中识别。h]h)}(ho以下内容 **仅** 在kernel-doc注释中识别, **不会** 在普通的 reStructuredText文档中识别。h](h 以下内容 }(hj[hhhNhNubhstrong)}(h**仅**h]h仅}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1jchj[ubh! 在kernel-doc注释中识别, }(hj[hhhNhNubjd)}(h **不会**h]h不会}(hjwhhhNhNubah}(h]h ]h"]h$]h&]uh1jchj[ubh0 在普通的 reStructuredText文档中识别。}(hj[hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhM=hjWubah}(h]h ]h"]h$]h&]uh1jUhj"hhhhhNubhdefinition_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&]uh1jhhhMGhj ubj)}(hhh]h)}(h6常量的名称(未交叉引用,仅格式化)。h]h6常量的名称(未交叉引用,仅格式化)。}(hj. hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMGhj+ ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhhhMGhjhhubj)}(hX````literal```` 预格式化文本块。输出将使用等距字体。 若你需要使用在kernel-doc脚本或reStructuredText中有特殊含义的字符,则此功能 非常有用。 若你需要在函数描述中使用类似于 ``%ph`` 的东西,这特别有用。 h](j)}(h````literal````h]j)}(hjN h]h ``literal``}(hjP hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjL ubah}(h]h ]h"]h$]h&]uh1jhhhMOhjH ubj)}(hhh](h)}(h6预格式化文本块。输出将使用等距字体。h]h6预格式化文本块。输出将使用等距字体。}(hjf hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMJhjc ubh)}(hr若你需要使用在kernel-doc脚本或reStructuredText中有特殊含义的字符,则此功能 非常有用。h]hr若你需要使用在kernel-doc脚本或reStructuredText中有特殊含义的字符,则此功能 非常有用。}(hjt hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMLhjc ubh)}(hT若你需要在函数描述中使用类似于 ``%ph`` 的东西,这特别有用。h](h.若你需要在函数描述中使用类似于 }(hj hhhNhNubj)}(h``%ph``h]h%ph}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh 的东西,这特别有用。}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMOhjc ubeh}(h]h ]h"]h$]h&]uh1jhjH 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&]uh1hhhhMXhj9 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)}(hj\ h]h &typedef name}(hj^ hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjZ ubah}(h]h ]h"]h$]h&]uh1jhhhM[hjV ubj)}(hhh]h)}(hTypedef引用。h]hTypedef引用。}(hjt hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM[hjq ubah}(h]h ]h"]h$]h&]uh1jhjV 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^hj ubj)}(hhh]h)}(hu结构体或共用体成员引用。交叉引用将链接到结构体或共用体定义,而不是直接到成员。h]hu结构体或共用体成员引用。交叉引用将链接到结构体或共用体定义,而不是直接到成员。}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM^hj ubah}(h]h ]h"]h$]h&]uh1jhj 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&]uh1jhj"hhhhhNubjY)}(hhh](j^)}(h从reStructuredText交叉引用h]h从reStructuredText交叉引用}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j]hj hhhhhMdubh)}(h无需额外的语法来从reStructuredText文档交叉引用kernel-do注释中定义的函数和类型。 只需以 ``()`` 结束函数名,并在类型之前写上 ``struct`` , ``union`` , ``enum`` 或 ``typedef`` 。 例如::h](hu无需额外的语法来从reStructuredText文档交叉引用kernel-do注释中定义的函数和类型。 只需以 }(hj( hhhNhNubj)}(h``()``h]h()}(hj0 hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj( ubh, 结束函数名,并在类型之前写上 }(hj( hhhNhNubj)}(h ``struct``h]hstruct}(hjB hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj( ubh , }(hj( hhhNhNubj)}(h ``union``h]hunion}(hjT hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj( ubh , }hj( sbj)}(h``enum``h]henum}(hjf hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj( ubh 或 }(hj( hhhNhNubj)}(h ``typedef``h]htypedef}(hjx 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 域jjuh1j*hj jKubh 文档。}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMvhj hhubeh}(h]restructuredtextah ]h"]从restructuredtext交叉引用ah$]h&]uh1jXhj"hhhhhMdubeh}(h]id10ah ]h"]高亮与交叉引用ah$]h&]uh1jXhjZhhhhhM8ubjY)}(hhh](j^)}(h总述性文档注释h]h总述性文档注释}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j]hj 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). */}hj9 sbah}(h]h ]h"]h$]h&]jjuh1jhhhMhj hhubh)}(h``DOC:`` 后面的标题用作源文件中的标题,但也用作提取文档注释的标识符。因此, 文件中的标题必须是唯一的。h](j)}(h``DOC:``h]hDOC:}(hjK hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjG ubh 后面的标题用作源文件中的标题,但也用作提取文档注释的标识符。因此, 文件中的标题必须是唯一的。}(hjG hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMhj hhubeh}(h]id11ah ]h"]总述性文档注释ah$]h&]uh1jXhjZhhhhhMyubeh}(h] kernel-docah ]h"]编写kernel-doc注释ah$]h&]uh1jXhhhhhhhKubjY)}(hhh](j^)}(h包含kernel-doc注释h]h包含kernel-doc注释}(hjv hhhNhNubah}(h]h ]h"]h$]h&]uh1j]hjs hhhhhMubh)}(hm文档注释可以被包含在任何使用专用kernel-doc Sphinx指令扩展的reStructuredText 文档中。h]hm文档注释可以被包含在任何使用专用kernel-doc Sphinx指令扩展的reStructuredText 文档中。}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjs hhubh)}(h!kernel-doc指令的格式如下::h]h kernel-doc指令的格式如下:}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjs hhubj)}(h".. kernel-doc:: source :option:h]h".. kernel-doc:: source :option:}hj sbah}(h]h ]h"]h$]h&]jjuh1jhhhMhjs hhubh)}(hX*source* 是相对于内核源代码树的源文件路径。 支持以下指令选项:h](j)}(h*source*h]hsource}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubhP 是相对于内核源代码树的源文件路径。 支持以下指令选项:}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMhjs 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 hhhNhNubj)}(h*[source-pattern ...]*h]h[source-pattern ...]}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhhhMhj ubj)}(hhh](h)}(h包括 *source* 中使用 ``EXPORT_SYMBOL`` 或 ``EXPORT_SYMBOL_GPL`` 导出的所有 函数的文档,无论是在 *source* 中还是在 *source-pattern* 指定的任何文件中。h](h包括 }(hj hhhNhNubj)}(h*source*h]hsource}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj 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 hhhNhNubj)}(h*source*h]hsource}(hj. hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh 中还是在 }(hj hhhNhNubj)}(h*source-pattern*h]hsource-pattern}(hj@ hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh 指定的任何文件中。}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMhj ubh)}(h当kernel-doc注释被放置在头文件中,而 ``EXPORT_SYMBOL`` 和 ``EXPORT_SYMBOL_GPL`` 位于函数定义旁边时, *source-pattern* 非常有用。h](h2当kernel-doc注释被放置在头文件中,而 }(hjX hhhNhNubj)}(h``EXPORT_SYMBOL``h]h EXPORT_SYMBOL}(hj` hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjX ubh 和 }(hjX hhhNhNubj)}(h``EXPORT_SYMBOL_GPL``h]hEXPORT_SYMBOL_GPL}(hjr hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjX ubh 位于函数定义旁边时, }(hjX hhhNhNubj)}(h*source-pattern*h]hsource-pattern}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjX ubh 非常有用。}(hjX 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 hhhNhNubj)}(h*[source-pattern ...]*h]h[source-pattern ...]}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhhhMhj ubj)}(hhh](h)}(h包括 *source* 中所有在 *source* 或 *source-pattern* 的任何文件中都没有使用 ``EXPORT_SYMBOL`` 或 ``EXPORT_SYMBOL_GPL`` 导出的函数和类型的文档。h](h包括 }(hj hhhNhNubj)}(h*source*h]hsource}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh 中所有在 }(hj hhhNhNubj)}(h*source*h]hsource}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh 或 }(hj hhhNhNubj)}(h*source-pattern*h]hsource-pattern}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh# 的任何文件中都没有使用 }(hj hhhNhNubj)}(h``EXPORT_SYMBOL``h]h EXPORT_SYMBOL}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh 或 }hj sbj)}(h``EXPORT_SYMBOL_GPL``h]hEXPORT_SYMBOL_GPL}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh% 导出的函数和类型的文档。}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMhj ubh)}(h例子::h]h例子:}(hjOhhhNhNubah}(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:}hj]sbah}(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: }(hj{hhhNhNubj)}(h*[ function/type ...]*h]h[ function/type ...]}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj{ubeh}(h]h ]h"]h$]h&]uh1jhhhMhjwubj)}(hhh](h)}(h在 *source* 中包含每个 *function* 和 *type* 的文档。如果没有指定 *function* , 则 *source* 中所有函数和类型的文档都将包含在内。h](h在 }(hjhhhNhNubj)}(h*source*h]hsource}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh 中包含每个 }(hjhhhNhNubj)}(h *function*h]hfunction}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh 和 }(hjhhhNhNubj)}(h*type*h]htype}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh 的文档。如果没有指定 }(hjhhhNhNubj)}(h *function*h]hfunction}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh , 则 }(hjhhhNhNubj)}(h*source*h]hsource}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh7 中所有函数和类型的文档都将包含在内。}(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&]uh1jhjwubeh}(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: }(hj.hhhNhNubj)}(h*[ function/type ...]*h]h[ function/type ...]}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj.ubeh}(h]h ]h"]h$]h&]uh1jhhhMhj*ubj)}(hhh](h)}(h<排除 *source* 中所有 *function* 和 *type* 的文档。h](h排除 }(hjMhhhNhNubj)}(h*source*h]hsource}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjMubh 中所有 }(hjMhhhNhNubj)}(h *function*h]hfunction}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1jhjMubh 和 }(hjMhhhNhNubj)}(h*type*h]htype}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjMubh 的文档。}(hjMhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMhjJubh)}(h例子::h]h例子:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjJubj)}(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&]jjuh1jhhhMhjJubeh}(h]h ]h"]h$]h&]uh1jhj*ubeh}(h]h ]h"]h$]h&]uh1jhhhMhj hhubj)}(hXfunctions: *[ function/type ...]* 这是“identifiers”指令的别名,已弃用。 h](j)}(h!functions: *[ function/type ...]*h](h functions: }(hjhhhNhNubj)}(h*[ function/type ...]*h]h[ function/type ...]}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubeh}(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: }(hjhhhNhNubj)}(h*title*h]htitle}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhhhMhjubj)}(hhh](h)}(hX 包含 *source* 中由 *title* 标题标识的 ``DOC:`` 文档段落。 *title* 中允许 空格;不要在 *title* 上加引号。 *title* 仅用作段落的标识符,不包含在输出中。 请确保在所附的reStructuredText文档中有适当的标题。h](h包含 }(hjhhhNhNubj)}(h*source*h]hsource}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh 中由 }(hjhhhNhNubj)}(h*title*h]htitle}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh 标题标识的 }(hjhhhNhNubj)}(h``DOC:``h]hDOC:}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh 文档段落。 }(hjhhhNhNubj)}(h*title*h]htitle}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh 中允许 空格;不要在 }(hjhhhNhNubj)}(h*title*h]htitle}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh 上加引号。 }(hjhhhNhNubj)}(h*title*h]htitle}(hj{hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh| 仅用作段落的标识符,不包含在输出中。 请确保在所附的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&]uh1jhjs hhhhhNubh)}(hR如果没有选项,kernel-doc指令将包含源文件中的所有文档注释。h]hR如果没有选项,kernel-doc指令将包含源文件中的所有文档注释。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjs hhubh)}(hkernel-doc扩展包含在内核源代码树中,位于 ``Documentation/sphinx/kerneldoc.py`` 。 在内部,它使用 ``tools/docs/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``tools/docs/kernel-doc``h]htools/docs/kernel-doc}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh+ 脚本从源代码中提取文档注释。}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMhjs hhubj)}(h.. _kernel_doc_zh:h]h}(h]h ]h"]h$]h&]refid kernel-doc-zhuh1jhMhjs hhhhubjY)}(hhh](j^)}(h.如何使用kernel-doc生成手册(man)页h]h.如何使用kernel-doc生成手册(man)页}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j]hj hhhhhMubh)}(hQ如果您只想使用kernel-doc生成手册页,可以从内核git树这样做::h]hP如果您只想使用kernel-doc生成手册页,可以从内核git树这样做:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj hhubj)}(hv$ tools/docs/kernel-doc -man \ $(git grep -l '/\*\*' -- :^Documentation :^tools) \ | scripts/split-man.pl /tmp/manh]hv$ tools/docs/kernel-doc -man \ $(git grep -l '/\*\*' -- :^Documentation :^tools) \ | scripts/split-man.pl /tmp/man}hj,sbah}(h]h ]h"]h$]h&]jjuh1jhhhMhj hhubh)}(hr一些旧版本的git不支持路径排除语法的某些变体。 以下命令之一可能适用于这些版本::h]hq一些旧版本的git不支持路径排除语法的某些变体。 以下命令之一可能适用于这些版本:}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj hhubj)}(hX $ tools/docs/kernel-doc -man \ $(git grep -l '/\*\*' -- . ':!Documentation' ':!tools') \ | scripts/split-man.pl /tmp/man $ tools/docs/kernel-doc -man \ $(git grep -l '/\*\*' -- . ":(exclude)Documentation" ":(exclude)tools") \ | scripts/split-man.pl /tmp/manh]hX $ tools/docs/kernel-doc -man \ $(git grep -l '/\*\*' -- . ':!Documentation' ':!tools') \ | scripts/split-man.pl /tmp/man $ tools/docs/kernel-doc -man \ $(git grep -l '/\*\*' -- . ":(exclude)Documentation" ":(exclude)tools") \ | scripts/split-man.pl /tmp/man}hjHsbah}(h]h ]h"]h$]h&]jjuh1jhhhMhj hhubeh}(h](kernel-doc-manj eh ]h"](.如何使用kernel-doc生成手册(man)页 kernel_doc_zheh$]h&]uh1jXhjs hhhhhMexpect_referenced_by_name}j\jsexpect_referenced_by_id}j jsubeh}(h]id12ah ]h"]包含kernel-doc注释ah$]h&]uh1jXhhhhhhhMubeh}(h]h ]h"]h$]h&]sourcehuh1hcurrent_sourceN current_lineNsettingsdocutils.frontendValues)}(j]N 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_handlerjerror_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}(jp jm jjjjj(j%jjjAj>j jjjjjjmjjjjjjj j j j jh je jhjej\j j[jXu nametypes}(jp jjj(jjAj jjjmjjj j jh jhj\j[uh}(jm jZjjjjDj%jjj8j>jjjDjj+jjjjjjjpjjj j"j j je j jejs j j jXj u 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&]levelKtypeINFOsourcehlineMuh1juba transformerN include_log]9Documentation/translations/zh_CN/doc-guide/kernel-doc.rst(NNNNta decorationNhhub.