GLM如何在不声明内联函数并在另一个(未连接的?)文件中将其定义的函数逃脱
How does glm get away with not declaring a function inline and defining it inline in another (unconnected?) file?
glm具有一些看起来像这样的代码,一旦在我的特定设置上解决了预处理器宏一旦解决:
type_vec3.hpp
struct vec3
{
/*...*/
vec3& operator=(vec3 const & v);
/*...*/
}
type_vec3.inl
inline vec3& vec3::operator=(vec3 const & v)
{ /* implementation */ }
我找不到.inl文件中的任何相关标头。当我尝试使用这种布局重写时,我要么会收到链接器错误(我相信这是由于标头文件声明和inline
指定定义之间的不匹配(或命名性问题(如果未包含在INL文件中的标题(。
这是github上的GLM:https://github.com/g--truc/glm。有问题的文件在这里:
https://github.com/g-truc/glm/blob/master/glm/detail/type_vec3.hpp(l179(
https://github.com/g-truc/glm/blob/master/glm/detail/type_vec3.inl(l214(
我正在使用的GLM版本中不存在这两个文件中包含的标题,这似乎表现不错。
有人可以解释一下这里发生了什么吗?
这只是将实现和声明分为单独文件的一种方式。.hpp
文件声明vec3
,然后 #include
s .inl
文件(除非请求非内部版本(。很容易错过#include
,因为它在.hpp
的末尾,但它在那里。尽管声称这些文件是没有连接的,但它们已连接,尽管朝着相反的方向相反。
(大概,如果定义了GLM_EXTERNAL_TEMPLATE
,则vec3::operator=
的定义将在单独的组件中提供,而不是作为内联函数。(
值得注意的另一个方面是这些文件在一个名为"详细信息"的目录中。这是一项惯例,说这些文件可能会更改,恕不另行通知。特别是,它们可能不存在于较旧的版本中。(它们也可能不存在于较新的版本中,但这是您查看最新版本的学术点。(
因此,总体图片是您#include
是普通标头文件之一,它将确保type_vec3.hpp
和type_vec3.inl
均为#include
D。这将内联定义放在每个具有vec3
声明的翻译单元中。
- 用C++在单独的头文件中完成函数体
- C++-试图将函数指针推回到另一个CPP文件中的矢量时出错
- 输入到文件并输出到另一个文件,并将流文件传递给函数
- 头文件、宏和内联函数c++
- 如何使用单独文件中的派生类访问友元函数对象
- C++无法定义虚拟函数 OUTER 类和头文件
- 回溯C++不打印函数,因此文件
- 如何从另一个文件继承私有成员变量和公共函数
- 从函数角度看ID到文件路径的内部与外部映射
- 区分非成员函数和头文件中的成员函数
- 如何使用对C函数和类对象的外部调用来处理C++头文件
- 如何在其他文件中使用函数
- 整数键映射到头文件中的成员函数指针
- C++(.cpp文件和.h文件)拆分代码并添加一个函数,提取 - 这很容易吗?
- 给定一个C++嵌套的私有结构类型,是否有从文件范围静态函数访问它的策略
- 用"=default"声明的函数应该只在头文件中执行
- 将单独的头文件和类定义文件链接到主函数文件 - G++ 返回重载"undefined reference to"构造函数
- C++ - 在一个函数/文件中初始化变量然后在main()/另一个文件中使用它的最佳方法是什么?
- C++单独的函数文件
- 只对单个函数/文件启用编译器优化