3

我知道内联函数是其主体插入到调用它们的位置的函数。那么为什么内联函数在被调用时不受范围变化的影响:

#include <iostream>

inline void alert(const std::string &str) { cout << str; }

int main() {
    using namespace std;

    alert("Hello World"); // cout << "Hello World";
}

这不起作用,因为我得到了错误cout was not declared in this scope,但如果我这样做std::cout了。如果内联函数的函数体插入作用域,为什么 C++ 不知道它cout是成员?std

4

4 回答 4

6

您描述的行为是一个宏。内联函数是一个常规函数,编译器是否内联它取决于编译器。在范围规则方面,它的行为与任何其他函数完全相同。

于 2012-08-14T20:08:52.637 回答
4

因为它是一个函数,所以它有自己的作用域。使其内联或不内联不会影响这一点。实际上,除了链接之外,对于外部可见的函数, inline 关键字并没有太大变化。编译器可以自由选择是否实际内联代码,内联仅作为建议。

于 2012-08-14T20:07:58.927 回答
3

因为 C++ 使用静态范围,而不是动态范围。编译器在定义函数的范围内查找名称,而不是在调用函数的范围内查找名称。

于 2012-08-14T20:07:58.353 回答
0

函数的内联是在链接时完成的。在编译时,C++ 根本不知道函数是否属于某个范围。因此引发了错误。为了不收到此错误 - 好吧,您必须将内联函数改为宏。

于 2012-08-14T20:14:18.880 回答