内联在源文件中
Inline in source file
我有一个有很多实用函数的大类。这些函数非常小,我想把它们内联。
问题是它们都在源文件中,应该留在源文件中,而不是移动到头文件(所以我不需要每次更改时重新编译所有内容)。
如果我将它们标记为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- 为测试目标创建具有不同源文件夹的文件
- 将图像添加到资源文件夹UWP C++
- 视觉工作室项目.提取源文件夹名称
- 生成一个生成文件,该生成文件使用Automake在一个步骤中编译和链接所有源文件
- make 命令如何避免重新编译未更改的源文件?
- C++两个源文件之间共享的枚举的静态实例
- 如何使用Qt 3D库加载和显示搅拌机.obj源文件场景
- 生成文件:动态源文件名和对象目录
- 无法使用 CMake 从其他文件夹添加源文件
- MinGW64 - Unicode 源文件错误?
- 有关从C++中的不同源文件引用类的问题
- "错误 (活动) E1696 无法打开源文件 "stdafx.h"--
- CMakeLists:使用 ExternalProject 从 Github 添加源文件
- 如何打印源文件中与 GDB 中的程序流关联的所有行号
- CMake 源文件找不到头文件
- 使用宏计算源文件行?
- 如何在 Eclipse 中一次从多个源文件进行构建
- 使用多个源文件时对类成员函数的未定义引用
- 给定一个源文件,有没有办法要求 gcc 返回仅直接包含的头文件的列表?
- 是否可以跨多个源文件构建 constexpr 数据结构?