范围问题:以下代码中的内联函数将访问哪个变量?

Scope issue: which variable would a inline function access in the following code ?

假设我们有以下c++代码:

int a = 10;

inline int add(int x){return a+x;}

void foo(int a, int b)
{
     ... do something with a ...
     std::cout<<add(b);
}

int main()
{
     foo(12);
}

对于内联函数add,它使用的"a"变量是全局变量"a"。但是,在 foo() 的函数调用中,我们有另一个局部变量 "a"。 如果 add 不是内联函数,它肯定会使用全局 "a",但是上面的代码会发生什么?有什么规定吗?

这个内联函数

int a = 10;

inline int add(int x){return a+x;}

处理全局变量a

当编译器解析函数定义时,它必须知道 a 是如何定义的,如果前面没有声明 a 的语句,编译器将发出错误。

因此,在这个函数定义中,编译器引用全局变量 a,具体取决于函数将被内联的位置。

还要考虑到与 lambda 表达式相反,函数无法捕获局部变量。

根据 C++ 标准,函数不能在其他函数中定义。虽然一些编译器有自己的语言扩展。在这种情况下,您应该阅读具有此类扩展的编译器随附的文档。

首先,foo 需要 2 个参数,因此您的代码现在无法正常工作。

其次,由于您还没有为 add 函数声明一个与具有全局作用域的变量同名的参数,它将只使用具有全局作用域的变量。

如果您将 add 声明为:

inline int add(int a, int b){return a + b;}

局部参数a将屏蔽具有全局范围的参数;