全局变量和static全局变量的区别

我查了资料全局变量在其它文件也可以引用,我在一个文件函数体外声明了全局变量int i,在另外一个文件里使用他编译器就报错说i没有定义了,怎么回事?同样我声明了extern int i,在另外一个文件里引用也说i没有定义。全局变量和extern型的不是声明了就可以用吗?
我在extern char*型的函数里定义一个int 型的flag,其它函数里没有定义过这个变量,在这个函数里所有变量都是char型的或者char*的;
flag=0<*(tp+1)然后指针就出错了,我调试过多次证实是这里出问题,说该内存不能为read,我把flag改为char型的就没事,改成double,float都出错;
是不是extern char*型的函数里不可以定义int型的变量,或者flag要和*tp的类型一致(*tp是指针)
说明一下,标题是打错的,所以只看补充不要看标题

全局变量的说明之前再加以static 就构成了静态的全局变量。全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式。这两者在存储方式上并无不同。这两者的区别虽在于非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。而静态全局变量则限制了其作用域,即只在定义该变量的源文件内有效,在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错误。从以上分析可以看出,把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域, 限制了它的使用范围。
温馨提示:内容为网友见解,仅供参考
第1个回答  2019-11-18
static修饰的成员变量,在类加载的时候就会分配空间,从属于类,所有的对象共享这一个变量;
而普通的成员变量从属于对象,每个对象都有自己的变量;
第2个回答  2019-10-12
你说的普通全局变量指的是包含在代码块中的?{}中,static{}与{}中代码的区别在于static在实例化时只能被执行一次,比如定义student类
,再main方法中实例化两次在static{}和{}分别写一行打印语句,你会发现{}中打印输出语句被执行了两次static{}只有一行‘;’补充一下static{}中的最先执行;
第3个回答  2010-09-18
你这标题和内容貌似说的不是一个事情啊

你说的extern问题 extern要写在你说的另一个文件里的

关于你的问题补充,
1 是不是*(tp+1)的问题呢?
2 flag=0<*(tp+1)这句的后面是不是还有对flag的操作呢?那里的操作要求flag是char型,可是被你声明成int型了。
第4个回答  推荐于2017-11-23
flag=0<*(tp-1) 虽然和这个是等价的 if(0<*(tp-1))flag=1
else flag=0
但类型要一致本回答被提问者采纳
相似回答