什么时候可以在头文件中定义函数? [重复]

问题描述 投票:0回答:1

晚上好,

我是 C++ 新手,但我的印象是不能在头文件中定义函数。

我一直在查看一些开源代码,似乎已经在头文件中定义了一个类,并且没有拆分为 .h / .cpp。

class Action
{
public:
    virtual ~Action() {}
    
    virtual string GetName() { return "Action"; }
    virtual void RequestUpdate(ActionContext* context) {}
    virtual void Do(ActionContext* context, double value) {}
    virtual void Touch(ActionContext* context, double value) {}
    virtual double GetCurrentNormalizedValue(ActionContext* context) { return 0.0; }
    virtual double GetCurrentDBValue(ActionContext* context) { return 0.0; }

    int GetPanMode(MediaTrack* track)
    {
        double pan1, pan2 = 0.0;
        int panMode = 0;
        DAW::GetTrackUIPan(track, &pan1, &pan2, &panMode);
        return panMode;
    }
};

同一个项目中似乎还有许多其他定义函数的头文件。我在这里错过了什么吗?

完整头文件在这里

c++ function file header
1个回答
3
投票

什么时候可以在头文件中定义函数?

当满足以下所有条件时:

  1. 该函数被声明为内联(无论是显式还是隐式)。
    • 如果定义非内联函数头并将该头包含到多个翻译单元中,则会违反 ODR,从而导致程序格式错误(无需诊断)。
    • 请注意,当函数被声明为内联时,它必须在所有使用它的 TU 中定义,因此应该在标头中定义。因此,如果以下其他条件不适用,则不应将函数声明为内联。
    • 请注意,隐式实例化的函数模板是内联函数。因此,除非您有固定的模板实例化集,否则模板函数实际上必须在标头中定义。这同样适用于类模板中的非模板函数。
  2. 该函数不会向标头引入新的依赖项。
    • 标头的依赖关系作为包含标头的任何内容的依赖关系传播。这会增加组件之间的耦合,这是不希望的。
  3. 功能不经常改变。
    • 标头往往包含在多个 TU 中,因此修改标头需要重新编译多个 TU,这会减慢大型项目的开发速度。
  4. 该函数的编译成本很低。 (如果函数位于预编译头中,这并不重要)
    • 标头往往包含在多个 TU 中,并且重复昂贵的编译会显着减慢从头开始的编译速度。
© www.soinside.com 2019 - 2024. All rights reserved.