如何在C++中引用与本地变量同名的全局变量?

15

如果存在一个全局变量,函数的参数也具有相同的名称,而期望的结果是本地变量和全局变量的总和,在这种特殊情况下,我们如何引用全局变量?我知道这样做不是一个好主意,但只是出于好奇。

int foo = 100;

int bar(int foo)
{
    int sum=foo+foo; // sum adds local variable and a global variable
    return sum;
}

int main()
{
    int result = bar(12);
    return 0;
}

1
如果被遮蔽了,那就被遮蔽了 :( ... - πάντα ῥεῖ
6
::foo 是全局的 foo,对吗? - Jonathan Leffler
我想弄清楚的是,函数的参数名是否可以与全局变量同名? - Faisal Naseer
http://ideone.com/d8Cc1c - Paul R
3个回答

25

迄今为止最好的选择是重新命名函数参数,使其不与全局变量冲突,这样就不需要绕过问题。

假设重新命名选项不可接受,请使用::foo来引用全局范围内的foo

#include <iostream>

int foo = 100;

int bar(int foo)
{
    int sum = foo + ::foo; // sum adds local variable and a global variable
    return sum;
}

int main()
{
    int result = bar(12);
    cout << result << "\n";
    return 0;
}

本地名称与全局名称之间的冲突很糟糕 - 它们会导致混淆 - 因此值得避免它们。您可以使用GCC(g ++和对于C代码的gcc )中的-Wshadow选项报告阴影声明的问题;结合-Werror,它会停止代码编译。


5

使用::foo是不可取的,会使所有人都感到困惑,你真的不应该那样做。相反,你应该重新命名其中一个变量。使用::前缀来解决这个问题是一个非常糟糕的想法。


1
我知道这很糟糕,但我只是在挑选逻辑。 - Faisal Naseer

-2

最佳实践是始终使用前导小写字母"g"来命名全局变量,例如gX gY。

然而,在开始时你应该如何命名变量并不清楚。

::foo。这是一个很酷的技巧。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接