大家好,欢迎来到IT知识分享网。
很多C语言书里说全局变量怎么样怎么样,其实,C语言标准没有定义过全局变量。你希望在你的程序里有全局变量,必须自己搞出来。下面是2004年我在某BBS上的一次讨论。先照原来的存档完整贴出来,条友们如果有兴趣,以后改写成文章。其中的beepbug就是本人。
如何定义一个全局变量?
发信人: Solomon(Solomon), 信区: C
我想在一个文件中定义一个全局变量,并在多个文件中使用它。不知如何定义怎样编译?
我用的是gcc,但总出现重复定义的错误,难道还要用extern。
发信人: typeid(TypeID), 信区: C
en 是的。在某一个文件中( 非头文件)定义这个变量,在其他文件中 用extern 声明 并且不要初始化 因为如果初始化即便加了extern 也是定义。
发信人: Solomon(Solomon), 信区: C
在VC下好象不用extern 也可以,不知为什么?
发信人: typeid(TypeID), 信区: C
不用就不是同一个变量了。
发信人: Newe(呢我们), 信区: C
重复定义的错误是因为所有module都link的时候,肯定有不只一次做了初始化。其实extern是可以省略的
但是全局变量只能有最多一次初始化,没有初始化的,最终会link在一个地址上。
发信人: Newe(呢我们), 信区: C
symbal table里是不会有两个名字一样,地址不一样的变量的。
发信人: typeid(TypeID), 信区: C
这个不是关键。关键在于声明的全局变量默认就是extern。所以同一个名字的变量自然会被绑定到同一地址。如果 每个变量名前加上 static 就不一样 即便相同名字也不会有问题
发信人: Newe(呢我们), 信区: C
这个的确没错,extern是默认的。static是一个module的私有symbol
发信人: beepbug(自说自话), 信区: C
在一个源文件里做Definition,在所有其它文件里用extern做Declaration。习惯是在有main()的文件里做Definition。Definition引发存储分配,即真正生成实体。Declaration是使在另一文件里Defined的实体在本文件里可见,也就是把它的作用域扩大到本文件。
中译本和国人写的书对这两个概念有点乱。
有人说,不要在Declaration里初始化。概念不清。Declaration不生成实体,如何做初始化?Declaration与初始化这两个概念是互斥的。实体的初始化只能在实体Definition处做。即使到了C++,仍是如此。
如果你在你的文件里Defining了一个实体,只想自己用,你可以在Defining时前缀static。这样,在其它文件里就不能用extern来引入这个实体了。
因此,在C里,一个实体的作用域可以是单个文件,或几个文件,或所有文件。
发信人: typedef(C plus plus), 信区: C
所有定义都是声明。所有函数变量等等之类的都要在使用前声明。难道你定义了一个函数在main前面,之后你还需要声明么?不需要了。因为定义也是声明的一种,它包含了声明。所以,说定义不是声明,就犹如说白马不是马。
发信人: beepbug(自说自话), 信区: C
我说的是Object,这里不妨翻译成实体。大概是为了不和后来的对象相混淆,有人改用Entity。原帖指的也是实体。不包括函数。一个是数据(在C++里扩展成可内含代码的数据),一个是代码。翻翻Primer,也可看出其区别。
在书写严谨的C书里,两个D是从头到脚分得清清楚楚的。
到了C++,也是一样。类是声明出来的,不是定义出来的。而对象是按某类定义出来的。没有一块空间用来存放类,但对象必须占有一块空间。在定义对象时,构造函数对其初始化。形式变了,但实质没变。还是在定义时初始化。
我已说了,在大多数书里,两个D是互换着乱用。我们跟着乱用也不犯错误。但是,我认为,在肚子里分清两者区别,对理解和掌握基本概念,及以后理解和掌握新概念,都有好处。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/189406.html