是否存在可以在头文件中定义C函数的情况?

是否存在可以在头文件中定义C函数的情况?,c,function,C,Function,是否存在可以在头文件中定义函数的情况?有人告诉我,我尊重他的意见,在某些情况下,函数可以在多个C源文件包含的头文件中定义。但是,我找不到。只是确认一下,我在头文件中在线定义了函数,但这也不起作用。我会的,但还没有找到任何答案。这方面没有实际要求。我只是想看看C标准中是否有我不知道的部分允许这样做。感谢您的回答头文件中不应定义任何C函数 函数声明可以放在头文件中 但是函数定义不应该出现在头文件中 原因: 若函数定义在头文件中,那个么头文件将包含在多个c文件中,当它们要编译时,它们将给出相同文件的多

是否存在可以在头文件中定义函数的情况?有人告诉我,我尊重他的意见,在某些情况下,函数可以在多个C源文件包含的头文件中定义。但是,我找不到。只是确认一下,我在头文件中在线定义了函数,但这也不起作用。我会的,但还没有找到任何答案。这方面没有实际要求。我只是想看看C标准中是否有我不知道的部分允许这样做。感谢您的回答

头文件中不应定义任何C函数

函数声明
可以放在头文件中

但是
函数定义
不应该出现在头文件中

原因:

若函数定义在头文件中,那个么头文件将包含在多个c文件中,当它们要编译时,它们将给出相同文件的多定义错误


静态内联函数可以在头文件中定义

但这不应该被使用,因为

在这种情况下,“static inline”中的“static”关键字是有害的 其中“静态内联”函数包含在N中并编译 不同的文件,不进行内联。在这种情况下,人们会 通常希望将此函数的N个副本合并为一个, 避免代码膨胀。但是“static”关键字阻止了这一点,强制
链接器无法合并这些冗余函数

头文件中不应定义任何C函数

函数声明
可以放在头文件中

但是
函数定义
不应该出现在头文件中

原因:

若函数定义在头文件中,那个么头文件将包含在多个c文件中,当它们要编译时,它们将给出相同文件的多定义错误


静态内联函数可以在头文件中定义

但这不应该被使用,因为

在这种情况下,“static inline”中的“static”关键字是有害的 其中“静态内联”函数包含在N中并编译 不同的文件,不进行内联。在这种情况下,人们会 通常希望将此函数的N个副本合并为一个, 避免代码膨胀。但是“static”关键字阻止了这一点,强制
链接器无法合并这些冗余函数

是,但是仅当声明为
静态内联时

仅声明为
inline
的函数的行为与不使用修饰符定义的函数完全相同,只是它们可能在中定义为
inline
的翻译单元中内联。它们仍然具有全局作用域,因此将它们包含在头文件中会导致错误,因为函数将被多次定义


另一方面,静态内联
函数没有全局作用域-它们只存在于使用它们的地方,与您可能想到的内联函数更为一致(ha-ha)。因此,它们适合在头文件中使用。

是,但仅当声明为
静态内联时才使用

仅声明为
inline
的函数的行为与不使用修饰符定义的函数完全相同,只是它们可能在中定义为
inline
的翻译单元中内联。它们仍然具有全局作用域,因此将它们包含在头文件中会导致错误,因为函数将被多次定义


另一方面,静态内联
函数没有全局作用域-它们只存在于使用它们的地方,与您可能想到的内联函数更为一致(ha-ha)。因此,它们适合在头文件中使用。

作为对内联函数的回答/讨论的旁注,我相信理论上可以用与普通.c文件相同的方式在头文件中定义函数,前提是头文件只包含一次,并且只包含在单个位置


虽然我不确定标准是否明确禁止这样做,但它的思想是头文件的内容基本上被复制并粘贴到源文件的顶部,从哪个角度来看,这没有问题。

作为关于内联函数的回答/讨论的旁注,我相信理论上可以用与普通.c文件相同的方式在头文件中定义函数,前提是头文件只包含一次,并且只包含在单个位置


虽然我不确定标准是否明确禁止这样做,但从哪个角度来看,头文件的内容基本上是被复制并粘贴到包含它的源文件的顶部,没有问题。

多定义错误可以通过
静态
静态内联
内联
规范来克服。然后多个文件将在包含文件的范围内拥有自己的静态函数副本。这个设计在技术上是错误的。@Jayesh在我的回答中读了我的编辑。为什么不应该使用静态内联定义为
static inline
的函数对链接器是隐藏的。永远不会有任何东西可以合并;除非在一个TU中包含
extern
定义,否则它永远不会以非内联形式出现。获取没有
extern
对应项的
静态内联
函数的地址将因链接错误而失败。这是C标准所要求的。多定义错误可以通过
静态
静态内联
内联
规范来克服。然后,多个文件将在包含文件的范围内拥有自己的静态函数副本。“这个设计在技术上是错误的。”贾耶什·里德说