如何在C里定义一个全局变量?

如何在C里定义一个全局变量?很多 C 语言书里说全局变量怎么样怎么样 其实 C 语言标准没有定义过全局变量 你希望在你的程序里有全局变量 必须自己搞出来 下面是 2004 年我在某 BBS 上的一次讨论 先照原来的存档完整贴出来 条友们如果有兴趣 以后改写成文章 其中的 beepbu

大家好,欢迎来到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

(0)
上一篇 2025-10-01 09:20
下一篇 2025-10-01 09:33

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信