1

我在一个类中有一些成员函数。当我使用内联说明符时,编译器会抱怨未定义的引用。

我努力了:

仅在类头文件中使用“内联”在函数定义之前。

仅在类 .cpp(指定成员函数的位置)文件中的函数声明之前使用“内联”。

同时做以上两件事。

显然,其中一种方式是正确的做法,其他方式都不正确。然而,尝试每个选项并没有让我得到一个编译的程序。

这是我正在尝试做的事情:

.hpp 文件:

class A{
    void func();
}

.cpp 文件:

... 包括 ...

inline void A::func()
{ 
    ...
}

或者也许“内联”会去其他地方。如上所述,我已经尝试了所有我能想到的可能组合。(现在看有人告诉我在函数名和参数之后我需要它,比如关键字“const”。)

有人对我做错了什么有任何想法吗?我试着用谷歌搜索正确的答案可能是什么,但没有运气。类中的“内联”函数甚至是一件事吗?

4

2 回答 2

8

内联函数必须在头文件中定义。函数的定义(主体)必须在所有试图使用该函数的翻译单元中可见。您可以直接在类中定义它。或者你可以在你的代码中定义它,即在类之外。但它必须在头文件中,而不是在.cpp文件中。

尝试在.cpp文件中定义内联函数将使其.cpp仅在该文件中可用。试图在其他.cpp文件中使用它会导致链接器错误(即“未定义引用”错误)。

于 2013-07-09T18:45:13.887 回答
1

inline任何内容放入 CPP 文件中只能内联该文件中的函数。如果你想鼓励编译器内联函数,你需要忘记 CPP 文件。相反,在 hpp 文件中执行此操作:

class A{
  inline void func();
};

void A::func() {...}

注意几点:

  1. 内联并不意味着您的函数将被内联。这是对编译器的提示。
  2. 您需要优化(gcc 中的 -O3)甚至有机会内联它
  3. 如果您在类中定义函数,则它隐含地具有 inline 关键字:

    class A{
      inline void func() {
        ...
      }
    };
    

    与上面在类中声明为内联而定义在外部相同。

有一些方法可以强制 GCC 使用函数属性内联您的代码,但我不会描述它们,因为使用它们很少是一个好主意。GCC 应该对每个函数的内联做“最好的”事情。强迫它做其他事情几乎总是会导致更差的性能。

于 2013-07-09T19:03:10.353 回答