类方法的外部 我想在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或抽象接口隐藏实现。