作用域问题:在以下代码中,内联函数将访问哪个变量? 假设我们有以下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); }

作用域问题:在以下代码中,内联函数将访问哪个变量? 假设我们有以下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); },c++,scope,inline,C++,Scope,Inline,对于内联函数add,它使用的变量a是全局变量a。但是,在foo的函数调用中,我们有另一个局部变量a。 如果add不是一个内联函数,它肯定会使用全局a,但是在上面的代码中会发生什么呢?有什么规则吗?这个内联函数 int a = 10; inline int add(int x){return a+x;} 处理全局变量a 当编译器解析函数定义时,它必须知道a是如何定义的,如果前面没有声明a的语句,编译器将发出错误 因此,在这个函数定义中,编译器引用全局变量a,该变量与函数的内联位置无关 还要考虑

对于内联函数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需要两个参数,这样您的代码就无法正常工作

第二,由于您没有为add函数声明与具有全局作用域的变量同名的param,因此它将只使用具有全局作用域的变量

如果您将add声明为:

内联int addint a,int b{返回a+b;}


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

请注意,内联甚至不能确保函数是内联的。内联并不意味着像宏那样进行文本替换。内联与从add访问的无关。无论add是否内联,变量解析的相同规则都适用。编译add时,只有一个a可解析:全局a。我同意@0x499602D2。听起来你把内联和预处理器宏扩展搞混了。我的错,我是说foo12,12。