我如何使用c++中的函数访问全局符号?

问题描述 投票:0回答:6

我想从函数中访问主函数中分配给全局变量的值。我不想在函数中传递参数。

我尝试过引用不同的堆栈溢出类似问题和 C++ 库。

#include <iostream>

long s;  // global value declaration

void output()  // don't want to pass argument
{
    std::cout << s;
}

int main()
{
    long s;
    std::cin >> s;  // let it be 5
    output()
}

我期望输出为

5
但它显示
0

c++ global-variables scope-resolution-operator
6个回答
6
投票

要访问全局变量,您应该在其前面使用

::
符号:

long s = 5;          //global value definition

int main()
{
    long s = 1;              //local value definition
    cout << ::s << endl;     // output is 5
    cout << s << endl;       // output is 1
}

而且在

s
中使用全局
cin
是如此简单:

cin >> ::s;
cout << ::s << endl;

在线尝试


2
投票

您正在主函数中声明另一个变量 s 。代码的第 7 行。这是 cin 中使用的变量。删除该行或在 s 之前使用 :: 。

long s;
cin >> ::s; //let it be 5
output();

1
投票

重要的是您要知道,在

s
中声明的局部变量
main()
和在文件范围内声明的变量
s
尽管名称不同,但并不相同。

由于在函数

s
shadows
中声明了局部变量main()(请参阅范围 - 名称隐藏)全局变量
s
,您必须使用范围解析运算符
::
来访问在文件范围内声明的全局变量
s

#include <iostream>

long s;

void output()
{
    std::cout << s;   // no scope resolution operator needed because there is no local
}                     // s in output() shadowing ::s

int main()
{
    long s;           // hides the global s
    std::cin >> ::s;  // qualify the hidden s
    output()
}

...或者去掉

s
中的本地
main()

也就是说,使用全局变量(没有真正需要)被认为是非常糟糕的做法。请参阅什么是“静态初始化顺序‘惨败’?”。虽然这不会影响POD,但它迟早会咬你。


0
投票
您可以简单地在全局变量之前使用::或者删除

long s;

来自 main() 因为您在 main() 函数中声明局部变量。尽管名称相同,但 Global 和 local 还是不同的。让我们通过以下示例通过为局部变量和全局变量指定不同的名称来了解更多信息。

#include <iostream> long x; // global value declaration void output() // don't want to pass argument { std::cout << x; } int main() { long s; std::cin >> s; //here you are storing data on local variable s output() // But here you are calling global variable x. }

在 main() 函数中 s 是局部变量,x 是全局变量,并且您在 output() 函数中调用全局变量。如果您具有相同的命名,您可以使用::(范围解析运算符)在 main 中调用全局 x,或者如果它们具有不同的名称,则可以通过变量名称调用它。

PS:如果您有任何问题,请发表评论,希望这会帮助您并了解错误所在。阅读有关局部变量和全局变量范围的更多信息这里


0
投票
您在全局范围内定义了output(),这意味着它将引用全局范围内的long s变量,而不是main()中定义的long s。


-1
投票
首先,当您声明全局变量而不分配值时,它会自动将其值设置为 0。

另一件事,你应该了解你的范围。主函数中的变量 s 在输出函数中不存在。

在输出函数中,您得到 0,因为您的全局变量设置为 0。

您可以通过为其分配不同的值来更改全局变量的值。

long s; //global value declaration void output() //don't want to pass argument { cout<<s; } int main() { cin>>s; //let it be 5 output() }
    
© www.soinside.com 2019 - 2024. All rights reserved.