我知道内联函数是将主体插入到调用它们的位置的函数。那么为什么内联函数在被调用时不受范围更改的影响呢:
#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
的成员?
您描述的行为是一个宏。内联函数是一个常规函数,是否内联它取决于编译器。它的行为与有关范围规则的任何其他函数完全相同。
因为它是一个函数,所以它有自己的作用域。是否内联不会影响这一点。事实上,内联关键字对外部可见的函数没有太大变化,除了它的链接。编译器可以自由选择是否实际内联代码,内联仅被视为建议。
因为C++使用静态作用域,而不是动态作用域。 编译器在定义函数的范围内查找名称,而不是在调用函数的范围内查找名称。
函数的内联是在链接时完成的。在编译时,C++不知道函数是否属于某个范围。因此,将引发错误。为了不收到此错误 - 好吧,您必须将内联函数设置为宏。