+ -
当前位置:首页 → 问答吧 → 函数内部的extern为什么会使用全局的变量

函数内部的extern为什么会使用全局的变量

时间:2011-12-17

来源:互联网

[code=C/C++][/code]
#include <iostream>
using namespace std;

int x = 5;

int f()
{
  int x = 3;
  {
  extern int x;
  return x;
  }
}

int main()
{
  cout<<f()<<endl;
}

这里为什么输出5呢?

作者: Daisy_Chain   发布时间: 2011-12-17

extern 声明告诉了编译器,这个范围内用了一个外部变量叫x,让后编译器到外边找到了一个x

作者: mougaidong   发布时间: 2011-12-17

引用 1 楼 mougaidong 的回复:

extern 声明告诉了编译器,这个范围内用了一个外部变量叫x,让后编译器到外边找到了一个x


extern int x;不是在一个作用域中(它和return一起包围在一个花括号中)吗?相对于此,那f()中的int x = 3;也算是外部的阿!而且,如果你将包围住它的括号去掉的话会出错。

int f()
{
  int x = 3;
  
  extern int x;
  return x;
  
}

--------------------------------------
 g++ hello.cpp -o tst
hello.cpp: In function ‘int f()’:
hello.cpp:10: error: declaration of ‘int x’
hello.cpp:8: error: conflicts with previous declaration ‘int x’

这又是什么原因?

作者: Daisy_Chain   发布时间: 2011-12-17

#include <iostream>
using namespace std;

int x = 5;///所以大括号外面的变量具有外部链接属性(不能称之为外部变量吧)

int f()
{
  int x = 3;内部链接属性
  {
  extern int x;/////显示的将x设置为外部链接属性
  return x;
  }
}

int main()
{
  cout<<f()<<endl;
}

作者: quan958201599   发布时间: 2011-12-17

C/C++ code
#include <iostream>

using namespace std;

int x = 5;

namespace ns
{
    int x = 3;
    int f()
    {
        extern int x;
        return x;
    }
}


int main()
{
    cout << ns::f() << endl;
}

作者: mougaidong   发布时间: 2011-12-17

{
  extern int x; //重新声明x,且是外部变量(全局的),这个x的作用域为{}之间
  return x;
  }

作者: keiy   发布时间: 2011-12-17

引用 3 楼 quan958201599 的回复:

#include <iostream>
using namespace std;

int x = 5;///所以大括号外面的变量具有外部链接属性(不能称之为外部变量吧)

int f()
{
int x = 3;内部链接属性
{
extern int x;/////显示的将x设置为外部链接属性
return x;
}
}

int main()
……


我可以这样认为吗:在不同域中有两个名为x的变量,虽然名称相同,但是性质不同。使用extern int x;就是为了声明使用具有外部链接属性的那个x。

作者: Daisy_Chain   发布时间: 2011-12-17

引用 6 楼 daisy_chain 的回复:
引用 3 楼 quan958201599 的回复:

#include <iostream>
using namespace std;

int x = 5;///所以大括号外面的变量具有外部链接属性(不能称之为外部变量吧)

int f()
{
int x = 3;内部链接属性
{
extern int x;/////显示的将x设置为外部链接属性
return x;
}……


++

作者: quan958201599   发布时间: 2011-12-17

引用 4 楼 mougaidong 的回复:

C/C++ code
#include <iostream>

using namespace std;

int x = 5;

namespace ns
{
int x = 3;
int f()
{
extern int x;
return x;
}
}


int main()
{
cout << ns::f() <……


4L输出的结果是3

作者: Daisy_Chain   发布时间: 2011-12-17

其实我也有个疑问,是不是之所以函数内部的声明为外部链接属性的变量指向的是全局变量中的x=5而不是x=3是不是全局变量是存在堆中,而局部变量是存在栈中的

作者: quan958201599   发布时间: 2011-12-17

引用 9 楼 quan958201599 的回复:

其实我也有个疑问,是不是之所以函数内部的声明为外部链接属性的变量指向的是全局变量中的x=5而不是x=3是不是全局变量是存在堆中,而局部变量是存在栈中的


好长的一句话,全局变量好像是存储在静态区的吧。

作者: Daisy_Chain   发布时间: 2011-12-17