代码之家  ›  专栏  ›  技术社区  ›  nabulke

头文件中的代码总是内联的吗?

  •  14
  • nabulke  · 技术社区  · 16 年前

    他说在头文件中定义的代码总是由编译器内联的(就像我的示例头中函数GetNumber()中的代码)。我说它有时是内联的,每当编译器决定这样做的时候。那么,我们中的哪一个会因为说谎而带蛋糕上班呢?或者我们都错了。。。?

    MyClass.hpp文件

       class MyClass
        {
        public:
        MyClass();
        ~MyClass();
    
        int GetNumber() const 
        {
         //...; 
         return m_number;
        };
    
        private:
        int m_number;
        };
    
    7 回复  |  直到 16 年前
        1
  •  12
  •   JoeG    16 年前

    在类中定义的任何函数(如GetNumber示例)而不是仅仅声明的函数都是隐式的 inline . 这意味着它等同于使用

    最现代的编译器处理 内联 作为一个联动命令,仅此而已。有些编译器提供更强的关键字,如CL __forceinline

    所以你在某种程度上既对又错。

        2
  •  7
  •   adf88    16 年前

    你的朋友错了,你是对的。

    尝试运行gcc预处理器,您将看到:

    gcc -E some_source_file_with_includes
    
        3
  •  4
  •   liaK    16 年前

    (我猜)

    从C++标准文档中获取内联函数,

    1. 使用内联说明符声明内联函数。

    2在类中定义的函数 定义是一个内联函数。

    所以就像你同事说的那样 确实是内联函数

    代码替换 用于内联函数而不是普通函数调用 我希望这就是你的意思 )即使编译器不替换它,它仍然是一个内联函数。

    希望能消除你的顾虑。。

        4
  •  3
  •   Matti Virkkunen    16 年前

    这取决于“内联”是什么意思。如果在头文件中定义了某个内容,它将被分别编译到包含它的每个编译单元中。是否有 电话 函数的内联将由编译器决定。

        5
  •  2
  •   sbi    16 年前

    定义的类成员函数 (与仅 )在类的定义中 含蓄地 inline

    您可以很容易地检查这个:用头和两个实现文件创建一个小型C++项目,定义一个函数

    void print(std::ostream& os)
    {
      os << "Hello, world!\n";
    }
    

    内联 在函数定义之前,错误就会消失。

    const int answer = 42;
    

    在一个头不会使链接器抱怨的多个定义 answer ,而

    int question;
    

    威尔。

        6
  •  1
  •   falstro    16 年前

    不是这样的,如果在类声明中指定,则只有成员函数中的代码才会被内联(如果编译器决定这样做的话)。但它必须允许定义成员,因此可以将它们声明为C的等价物 static (这将允许它在编译单元中使用,但不能链接到其他对象文件),这将在每个对象文件中放置一个版本。你自己试试看,你会注意到除非你为类声明之外的任何东西指定inline关键字,否则你会得到重复的结果。

        7
  •  1
  •   John Warlow    16 年前

    _inline

    你可以用 _forceinline 如果你用的是 Microsoft C++ 使代码内联,但这可能会导致更大的二进制文件。