类方法的外部 我想在C++中使用ExtEnter类方法。我正在使用Visual Studio 2019。 我想强制方法内联,使用uu forceinline(如果没有extern,我将得到未解析的外部符号)。我不想将方法实现放在此头文件中,我想将实现放在其他.cpp文件中。 我注意到,当方法的实现在.cpp文件中时,该方法可以自动内联,而无需外部和_forceinline。我怎样才能强制它? 示例代码: class Window { public: void Show(); };
没关系类方法的外部 我想在C++中使用ExtEnter类方法。我正在使用Visual Studio 2019。 我想强制方法内联,使用uu forceinline(如果没有extern,我将得到未解析的外部符号)。我不想将方法实现放在此头文件中,我想将实现放在其他.cpp文件中。 我注意到,当方法的实现在.cpp文件中时,该方法可以自动内联,而无需外部和_forceinline。我怎样才能强制它? 示例代码: class Window { public: void Show(); };,c++,oop,C++,Oop,没关系 class Window { public: __forceinline void Show(); }; 从其他CPP调用此函数时获取未解析的外部符号。 通过extern,我得到: 对于简单函数,extern\uu forceinline可以很好地工作: 有两件事: 不能将成员函数声明为extern。这些已经有了外部联系 编译器要内联函数或方法,必须在头文件中定义(而不是声明)。这是为了让编译器在编译调用函数的代码时可以看到它 因此,只需将函数体放在头文件中,并删除extern,
class Window {
public:
__forceinline void Show();
};
从其他CPP调用此函数时获取未解析的外部符号。通过extern,我得到: 对于简单函数,extern\uu forceinline可以很好地工作: 有两件事:
extern
。这些已经有了外部联系extern
,就可以为成员函数指定extern
。
本标准在[dcl.stc]/5中对此进行了澄清:
外部说明符只能应用于变量和函数的名称。在类成员或函数参数的声明中不能使用外部说明符
当您使用extern时,您对编译器说您声明了一个变量或函数,但没有定义它。对于成员函数,这是不需要的:它们总是可以在类主体中声明,而无需定义:
class A {
public:
void f(); // you can define it in which ever compilation unit (cpp) you want
};
...
// Else where...may be in another cpp
void A::f() {...}
链接器将在需要时解析符号
内联不是很有用
[dcl.inline]/2
中的标准规定,不保证内联:
内联说明符向实现指示内联
函数体在调用点的替换是
优先于通常的函数调用机制正在执行一个实现
不需要在调用时执行此内联替换
此外,[dcl.inline]/6
解释了inline
和定义的元素,这些元素并不意味着工作正常:
内联函数或变量应在使用odr的每个翻译单元中定义,并且在每种情况下应具有完全相同的定义
(odr说所有定义每次都必须完全相同)
(在每个翻译单位中,指每个cpp或其中包含的标题)
另一方面,一些现代编译器的全局优化器能够实现与内联函数类似的性能效果,这就需要交叉编译单元(cpp)
特定于实现的forceinline
仔细使用inline
,进行成本/收益分析以决定是否进行内联
forceinline
允许您推翻编译器的判断。但是它附带了普通内联的所有要求:因此您需要在同一编译单元中定义函数才能使其工作
我不想把方法实现放在这个头文件中,我想把实现放在另一个.cpp文件中
听起来您只想将所有声明都放在一个文件中,如下所示:
这是您的窗口.h
-文件:
class Window
{
public:
void Show();
};
要将实现放在另一个文件中,必须使用scope操作符。
这是另一个window.cpp
-文件,您可以在其中实际实现以下功能:
#include "window.h"
Window::Show()
{
// Your implementation goes here
}
我希望我正确理解了您的问题,这会有所帮助。为什么要强制内联?在优化代码方面,编译器可能比您要好得多。代码混淆。我希望函数体在每次被调用时都被重复。这不会影响任何地方,请使用pimpl或抽象接口隐藏实现。