为什么内联函数不能看到内部范围?

时间:2012-08-14 20:04:23

标签: c++

据我所知,内联函数是将其主体插入到调用它们的位置的函数。那么为什么调用它们时不会受范围更改影响的内联函数:

#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,则会收到错误cout。如果内联函数的函数体插入到作用域中,为什么C ++不知道std是{{1}}的成员?

4 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:4)

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

答案 2 :(得分:3)

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

答案 3 :(得分:0)

在链接时间内完成功能的内联。在编译时,C ++不知道函数是否属于范围。因此提出了错误。为了不接收这个错误 - 你必须使你的内联函数成为宏。