类中的静态内联函数
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。
您正试图将独立函数(不属于某个类)放在一个类中 - 大概是因为您来自另一种不允许您编写独立函数的面向对象语言。
要编写一个包含 pow
、exp
、log
等函数的数学库,请创建命名空间 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
的存储类一起使用是很少见的。
【讨论】:
以上是关于类中的静态内联函数的主要内容,如果未能解决你的问题,请参考以下文章