类中的静态内联函数

Posted

技术标签:

【中文标题】类中的静态内联函数【英文标题】:Static inline functions in class 【发布时间】:2014-03-31 01:57:22 【问题描述】:

我想对我的数学函数进行分组。我的数学函数包括许多数学函数,包括“math.h”中的函数和一些常数值。它们不在类或命名空间中。由于性能原因,它们都是内联的。但是如果不可能的话,我希望它们分组在一个类中。我只想像这样使用我的功能:

MyMath::Pow(2, 2);
MayMath::PI;

所以我的问题是;如果我可以使用类,我认为函数和值必须是静态的,但静态方法不能内联,因为我知道。如果找不到解决方案,我可以使用“MyMath”作为命名空间。

【问题讨论】:

在类定义中定义静态方法时,为什么不能内联? 我知道静态修饰符不允许任何其他修饰符。我错了吗? 你反对使用命名空间的理由是什么? 您是否意识到inline 关键字实际上与允许内联函数没有任何关系?如果编译器愿意,许多函数都可以内联。 那么常量数据成员呢。我必须让它们保持不变而不是静态并为它们定义 get 方法还是什么? 【参考方案1】:

这听起来像XY Problem。

您正试图将独立函数(不属于某个类)放在一个类中 - 大概是因为您来自另一种不允许您编写独立函数的面向对象语言。

要编写一个包含 powexplog 等函数的数学库,请创建命名空间 MyMath 并定义函数。不需要上课。

【讨论】:

“可能是因为你来自另一种不允许你编写独立函数的面向对象语言”是的,这是真的。 顺便说一句,我不认为,但命名空间复杂性是否有任何性能损失。在 n1::foo() 和 n1::n2::n3::foo() 之间? @CahitBurakKüçüksütcü 只是你必须做的打字量。 现在出现符号重复错误。我的 FMath::FConvert 命名空间中有一些常量值。我从“a.cpp”文件中包含了我的数学头。然后我包含来自“b.h”的“a”标头,但我收到错误“b.obj:-1: error: LNK2005: RAD_TO_DEG_32 already defined in a.obj”【参考方案2】:

静态函数/方法也可以是内联的。

并且类内部定义的方法默认是内联的。

【讨论】:

【参考方案3】:

但是我知道静态方法不能内联

这不是真的,静态方法也可以内联。

【讨论】:

【参考方案4】:

静态函数可以与所有其他函数一样内联。但是,对于您的用例,命名空间是更好的解决方案。

【讨论】:

【参考方案5】:

static inline 完全有效。

如果存储类为extern,则标识符有外部链接,内联定义也提供外部定义。

如果存储类是静态的,则标识符有内部链接,内联定义在其他翻译单元中是不可见的。

事实上,将inline 与不同于static 的存储类一起使用是很少见的。

【讨论】:

以上是关于类中的静态内联函数的主要内容,如果未能解决你的问题,请参考以下文章

c++中的内联函数inline

类内的内联函数成员

内联函数和静态内联函数之间的区别

内联函数对作用

虚函数可以是内联函数吗?

为啥我不能在我的类中内联函数? [复制]