glm 如何避免不声明内联函数并在另一个(未连接的?)文件中内联定义它?
How does glm get away with not declaring a function inline and defining it inline in another (unconnected?) file?
glm 有一些看起来像这样的代码,一旦 pre-processor 宏在我的特定设置上被解析:
type_vec3.hpp
struct vec3
{
/*...*/
vec3& operator=(vec3 const & v);
/*...*/
}
type_vec3.inl
inline vec3& vec3::operator=(vec3 const & v)
{ /* implementation */ }
我在 .inl 文件中找不到任何相关的 header 包含。当我尝试用这种布局重写时,我要么遇到链接器错误(我认为这是由于 header 文件声明与 inline
指定的定义不匹配造成的)或命名空间问题(如果 header 未包含在 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)
这两个文件中包含的 headers 在我使用的 glm 版本中不存在,它似乎运行正常。
有人可以解释一下这是怎么回事吗?
这只是将实现和声明拆分到单独文件中的一种方法。 .hpp
文件声明 vec3
,然后 #include
声明 .inl
文件(除非请求 non-inline 版本)。很容易错过 #include
,因为它位于 .hpp
的末尾,但它就在那里。尽管声称文件未连接,但它们是连接的,尽管方向与预期相反。
(据推测,如果定义了 GLM_EXTERNAL_TEMPLATE
,vec3::operator=
的定义将在单独的组件中提供,而不是作为内联函数。)
另一个值得注意的方面是这些文件位于名为 "detail" 的目录中。这是一个约定,这些文件如有更改,恕不另行通知。特别是,它们可能不存在于旧版本中。 (它们也可能不存在于较新的版本中,但当您查看最新版本时,这更像是一个学术观点。)
所以总体情况是您 #include
一个正常的头文件,这将确保 type_vec3.hpp
和 type_vec3.inl
都是 #include
d 的顺序.这会将内联定义放入每个具有 vec3
声明的翻译单元中。
glm 有一些看起来像这样的代码,一旦 pre-processor 宏在我的特定设置上被解析:
type_vec3.hpp
struct vec3
{
/*...*/
vec3& operator=(vec3 const & v);
/*...*/
}
type_vec3.inl
inline vec3& vec3::operator=(vec3 const & v)
{ /* implementation */ }
我在 .inl 文件中找不到任何相关的 header 包含。当我尝试用这种布局重写时,我要么遇到链接器错误(我认为这是由于 header 文件声明与 inline
指定的定义不匹配造成的)或命名空间问题(如果 header 未包含在 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)
这两个文件中包含的 headers 在我使用的 glm 版本中不存在,它似乎运行正常。
有人可以解释一下这是怎么回事吗?
这只是将实现和声明拆分到单独文件中的一种方法。 .hpp
文件声明 vec3
,然后 #include
声明 .inl
文件(除非请求 non-inline 版本)。很容易错过 #include
,因为它位于 .hpp
的末尾,但它就在那里。尽管声称文件未连接,但它们是连接的,尽管方向与预期相反。
(据推测,如果定义了 GLM_EXTERNAL_TEMPLATE
,vec3::operator=
的定义将在单独的组件中提供,而不是作为内联函数。)
另一个值得注意的方面是这些文件位于名为 "detail" 的目录中。这是一个约定,这些文件如有更改,恕不另行通知。特别是,它们可能不存在于旧版本中。 (它们也可能不存在于较新的版本中,但当您查看最新版本时,这更像是一个学术观点。)
所以总体情况是您 #include
一个正常的头文件,这将确保 type_vec3.hpp
和 type_vec3.inl
都是 #include
d 的顺序.这会将内联定义放入每个具有 vec3
声明的翻译单元中。