如何使用C ++中的函数访问全局变量?

时间:2019-05-18 05:13:50

标签: c++ global-variables scope-resolution-operator

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

我尝试引用不同的堆栈溢出类似的问题和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

5 个答案:

答案 0 :(得分:4)

要访问全局变量,应在其前使用::符号:

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;

try it online

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

重要的是,您要知道s中声明的局部变量main()和在文件作用域中声明的变量s尽管名称不相同。

由于在函数s中声明了局部变量main(),所以阴影(请参见Scope - Name Hiding)是全局变量s,因此您必须使用Scope Resolution Operator ::访问在文件作用域声明的全局变量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()

也就是说,使用全局变量(无实际需要)被认为是非常不好的做法。参见What’s the “static initialization order ‘fiasco’?。虽然这不会影响POD s,但迟早会咬你。

答案 3 :(得分:0)

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

long s; 

来自main(),因为在main()函数中声明局部变量s时。尽管具有相同的名称,但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,或者如果它们使用不同的名称,则可以通过变量名调用全局x。

PS: 如果您有任何疑问,请写下来,希望这对您有所帮助,并了解错误所在。详细了解局部变量和全局变量here

的范围

答案 4 :(得分:-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()
}