有一个包含private
成员函数的类,我想标记为inline
(明确标记我暗示特定函数可能被内联的意图),但不要暴露他们的实现API消费者。为简单起见,它可能看起来像:
Airplane.h
class Airplane
{
char manufacturer[80];
char mode[80];
// ...
public:
void autopilot_steer_left(int degree);
// ...
private:
// ...
inline bool validate_hydraulic_on_left_wing(); // secret, patent-based, etc.
};
Airplane.cpp
#include "Airplane.h"
// ...
void Airplane::autopilot_steer_left(int degree)
{
// ...
}
我应该在哪里定义Airplane::validate_hydraulic_on_left_wing
?我知道常见的地方是Airplane.h
(可能在课堂内,所以它是inline
隐含的),但这与我的意图相矛盾。
答案 0 :(得分:4)
您可以在.cpp文件中使用关键字inline
:
inline void Airplane::autopilot_steer_left(int degree)
{
// ...
}
因此,您的实现将隐藏在.cpp文件和inline
中。
inline
效果的良好讨论:
Benefits of inline functions in C++?
答案 1 :(得分:4)
如果无法从单个翻译单元(即cpp文件)的外部调用该函数,那么将其标记为内联通常没有任何意义。
从C ++的角度来看,内联修饰符仅允许以多个单位定义函数。内联关键字背后不再有语义。
从函数调用的实际内联(即编译器优化)的角度来看,只有将编译器配置为永不内联未标记为内联的函数(如Visual C ++的/Ob1)时,它才有用。但是,现代编译器尝试内联所有函数是很正常的。在这种情况下,编译器甚至不会查看您是否将函数标记为内联函数:如果编译器认为它使代码更好,则单个单元内的任何调用都将被内联。
答案 2 :(得分:3)
这没有任何意义。内联函数的整个要点是确保调用点上的定义可用于直接替换调用。这与您想要做的事情完全相反:隐藏远离呼叫站点的定义。
无论如何,这并不重要,因为inline
完全被忽略用于内联目的,并且仅用于规定一些宽松的链接要求。但是,实际上,无论是否在其上写inline
,您的函数都不会被内联。
只需删除inline
关键字,然后像现在一样在外部定义该功能。
然后打开链接时优化,并希望您的编译器决定在链接时内联函数定义。这是最新的,你可以得到内联功能,希望足够"隐藏"为了你的愿望。
如果没有,那么真的重要吗?