内联在源文件中

Inline in source file

本文关键字:源文件      更新时间:2023-10-16

我有一个有很多实用函数的大类。这些函数非常小,我想把它们内联。

问题是它们都在源文件中,应该留在源文件中,而不是移动到头文件(所以我不需要每次更改时重新编译所有内容)。

如果我将它们标记为inline,我将得到

符号未找到

是否有办法使它们内联或我需要盲目信任链接时间优化器?
我需要代码在clang 3和gcc 4.6之间可移植,但基于编译器的#define s将是ok的(因此回答如何仅在一个编译器中做到这一点也是好的)。

将实现放在.inl文件中。只有必要的.cpp文件#include它。这种方式改变实现(触摸.inl文件)触发重新编译只依赖.cpp文件。对定义的更改(触摸.h文件)会触发所有使用该声明的文件的重新编译。

这对于内联函数和模板实现来说都是一种常见的做法。inl文件基本上应该被视为'included cpp'文件。

[这些]函数非常小,我想把它们内联。[但是]我不想每次修改都重新编译。

你不可能两者兼得。如果一个函数是内联的,那么你别无选择,只能在它发生变化时重新编译它的所有调用者。这就是内联的工作原理。即使您使用链接时优化器在链接时自动执行此操作,您仍然需要支付重新处理所有调用者的编译时成本。

顺便说一下,gcc 4.6和clang 3都没有达到标准的链接时间优化器。

编者旁白:我所知道的编译器中没有一个具有足够好的启发式,可以使手动inline注释变得不必要。即使是VS2010,我在评论中提到的一个链接时间优化器的例子,的scratch,仍然需要相当多的关于内联什么的建议。

如果你想要一个函数是inline 'd,你必须把它放在一个头文件,除非它只在同一个源文件中使用。原因是编译器需要实际的函数定义,以便将定义"内联"放置在调用它的任何地方,然后编译它。

您可以在这里和这里找到更多信息。

您需要强制内联函数-您将其放在类定义中。

一种选择是将内联函数放在预编译的头文件中,这将加快编译速度。但是由于内联函数的性质,所有使用它们的地方都必须重新编译。

http://gcc.gnu.org/onlinedocs/gcc/Precompiled-Headers.html