首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

extern隐式宣言

2013-03-12 
extern隐式声明在C++ primer上看到非 const 变量默认为 extern,要使 const 变量能够在其他的文件中访问,必

extern隐式声明
在C++ primer上看到非 const 变量默认为 extern,要使 const 变量能够在其他的
文件中访问,必须地指定它为 extern。这句话让我不理解,请看我的截图,是一个.h文件内的

int ival;//这是声明还是定义?变量默认为extern,那么它应该等价于extern int ival?
extern int ival;//这是声明还是定义?和上面是否重复?
extern int ival=10;//这算是定义了吧?
extern c++ 隐式
[解决办法]
你确定这个能编译过?

int ival;//这是声明还是定义?变量默认为extern,那么它应该等价于extern int ival?
这就是定义了,加了定义了.h文件不能被两个.c文件include,否则会有符号冲突

extern int ival;//这是声明还是定义?和上面是否重复?
这是声明,声明可以加好多个

extern int ival=10;//这算是定义了吧?
这也是定义,只不过把默认的extern写出来了
[解决办法]
1、int ival; 是定义包含声明 ,extern int ival;只是声明
    所以int ival 和 extern int ival 是不等价的。
2、extern int ival;只是声明,声明不为变量分配空间。编译的时候会认为你有这个变量。
例如:extern int ival; ival=1;你编译的时候是不会报错的,但运行时候会报错。
3、extern int ival=10;是变量的定义,因为初始化ival为10,就会分配给他内存空间,分配内存了就算定义了。

[解决办法]
引用:
引用:引用:可是非 const 变量默认为 extern,那么int ival 不就相当于extern int ival吗?
extern 只是一种属性,显式的话代表声明,《C专家编程》里有对这类问题非常详细的解答

VS下还真能编译过。。MS有了什么特殊处理吧。。
GCC 4.7是编译不过的,报……


例如:(1)
      a.cpp
        int ival;
      b.cpp
        ival=1;   成立
      (2)
      a.cpp
         const int iva
      b.cpp
         extern int ival;//加这句话就成立,不加就会出错。
         ival=1;
[解决办法]
引用:
我用的是VS2010,int ival是编译不通过的。所以我就搞糊涂了,明明primer上说非const变量默认是extern的,为什么还要显示的去extern下呢?


不显式的话,不就当成定义来进行处理了么,你可以在有初始化的定义的前面加上extern,但是不能把声明的extern去掉

定义和声明是两种东西,看起来像而已,编译过程中的作用是完全不同的,声明只起到了符号输出的作用,供链接时使用,定义才是程序使用的变量

热点排行