头文件中的代码将始终内联?

nab*_*lke 14 c++ inline

我刚与同事讨论了头文件中的代码:

他说,头文件中定义的代码将始终由编译器内联(如我的示例头中的函数GetNumber()中的代码).我说有时,只要编译器决定这样做,它就会被内联.那么我们哪一个人必须带上一块蛋糕才能说出肮脏的谎言?或者也许我们都错了......?

MyClass.hpp

   class MyClass
    {
    public:
    MyClass();
    ~MyClass();

    int GetNumber() const 
    {
     //...; 
     return m_number;
    };

    private:
    int m_number;
    };
Run Code Online (Sandbox Code Playgroud)

Joe*_*oeG 12

在类中定义的任何函数(如您的GetNumber示例)而不是仅仅声明是隐式的inline.这意味着它与使用inline关键字无关,因此由于这些函数的多个定义,标题的多个包含不会导致链接错误.

大多数现代编译器都将其inline视为链接命令而已.有些编译器提供了更强大的关键字,例如CL __forceinline,这意味着"如果可以的话,可以这样做".

所以你是对的,也是错的.


adf*_*f88 7

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

内联不取决于代码的位置(标题或不标题).预处理后,没有标题或非标题.整个单元是一个单独的文件,它包含所有包含的东西.

尝试运行gcc预处理器,然后你会看到:

gcc -E some_source_file_with_includes
Run Code Online (Sandbox Code Playgroud)

  • 内联确实取决于代码的位置.如果函数的源在另一个转换单元中声明,则无法内联,因为编译器无法看到定义,除非您有一个支持整个程序优化的编译器/链接器. (6认同)