C 当函数在不同的文件中实现时,((始终_inline))不起作用

C 当函数在不同的文件中实现时,((始终_inline))不起作用,c,gcc,inline-functions,C,Gcc,Inline Functions,我有一个文件funcs.h,其中有函数声明: inline void some_func( void ) __attribute__((always_inline)); inline void some_func( void ) { … } 然后我有一个文件funcs.c,其中有函数的实现: inline void some_func( void ) __attribute__((always_inline)); inline void some_func( void ) { … } 然

我有一个文件
funcs.h
,其中有函数声明:

inline void some_func( void ) __attribute__((always_inline));
inline void some_func( void ) { … }
然后我有一个文件
funcs.c
,其中有函数的实现:

inline void some_func( void ) __attribute__((always_inline));
inline void some_func( void ) { … }
然后在我的主文件
main.c
I
#中包含
funcs.h
并尝试在代码中的某个地方使用
some_func()
。但是,当我编译程序并查看二进制文件时,该函数似乎被编译为一个常规的单独函数,并像任何其他常规函数一样被调用,而不是作为内联函数嵌入


为什么会发生这种情况,有没有办法将实际的内联强制到这种情况中?(当然,除了使用
#define
宏而不是函数的选项。)

将实现放在标题中。如果它们在您打算进行内联的翻译单元中不可用,那么您就倒霉了。链接器(传统的链接器)对此无能为力。

编译器应该如何内联编译后找到的定义?您必须打开链接时间优化(
-flto
开关)。@ghostofstandardspast不是编译器,而是链接器。@user3477950,我想这是一个很好的观点。我记得微软说过链接器可以做的优化。@user3477950简单的测试表明,即使是
a+b
函数也没有与GCC4.8和
-flto
内联。此外,使用此属性会产生编译错误,因为编译器肯定知道它不能内联,而程序员坚持认为它应该内联。大多数现代工具链支持链接时优化,依靠链接时优化可能比在标题中转储大量定义更好。@user3477950:是,虽然依赖编译器优化,但代码< >代码> <代码> >属性多余。@去复印机……它告诉我,应该对编译器保持低级优化,尤其是现在。在头文件中,在C和非C++的情况下,应该是代码>静态内联。代码>内联< /COD>本身不标记函数为不可导出(但C++)。