为什么内联函数看不到作用域内部?



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

#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++不知道coutstd的成员?

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

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

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

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

最新更新