相关疑难解决方法(0)

为什么标题中的C++内联函数?

注意:这不是关于如何使用内联函数或它们如何工作的问题,更多的是为什么它们按照它们的方式完成.

类成员函数的声明不需要定义函数inline,它只是函数的实际实现.例如,在头文件中:

struct foo{
    void bar(); // no need to define this as inline
}
Run Code Online (Sandbox Code Playgroud)

那么,为什么一类功能的内嵌实施是在头文件?为什么我不能把内联函数放在.cpp文件中?如果我在哪里尝试将内联定义放在.cpp文件中,我会得到一个错误:

error LNK2019: unresolved external symbol 
"public: void __thiscall foo::bar(void)"
(?bar@foo@@QAEXXZ) referenced in function _main 
1>C:\Users\Me\Documents\Visual Studio 2012\Projects\inline\Debug\inline.exe 
: fatal error LNK1120: 1 unresolved externals
Run Code Online (Sandbox Code Playgroud)

c++ theory language-design inline c++-faq

109
推荐指数
7
解决办法
9万
查看次数

"内联"关键字vs"内联"概念

我问这个基本问题是为了让记录笔直.已经提到这个问题它的目前公认的答案,这是不能令人信服的.然而,第二多投票的答案提供了更好的洞察力,但也不完美.

在阅读下面时,区分inline 关键字和"内联" 概念.

这是我的看法:

内联概念

这样做是为了节省函数的调用开销.它更类似于宏式代码替换.没有什么可争议的.

inline关键字

感知A.

inline关键字是一个请求,以通常用于较小的函数的编译器,以便编译器可以优化它和做出更快的呼叫.编译器可以忽略它.

我对此提出异议,原因如下:

  1. 不会内联更大和递归的函数,编译器会忽略该inline关键字.
  2. 无论inline提及或不提及关键字,优化器都会自动内联较小的函数.

很明显,用户对使用关键字的函数内联没有任何控制权inline.

感知B

inline没有做内联的概念.把inline大/递归函数的未来将不利于小功能,不再需要它,为被内联.

确定使用的inline是保持一个定义规则.

即如果声明了一个函数,inline那么只有下面的东西是强制性的:

  1. 即使在多个转换单元中找到它的主体(例如,在多个.cpp文件中包含该头),编译器也只生成1个定义并避免多个符号链接器错误.(注意:如果该函数的主体不同,那么它是未定义的行为.)
  2. inline功能的主体必须在使用它的所有翻译单元中可见/可访问.换句话说,在任何一个文件中声明inline函数.h和定义将导致其他文件的"未定义的符号链接器错误" .cpp.cpp

判决书

"A"感觉完全错误,"B"感觉完全正确.

标准中有一些引用,但我期待一个答案,从逻辑上解释这个判决是真还是假.

c c++ inline-functions language-lawyer

37
推荐指数
2
解决办法
2990
查看次数