| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4528 人关注过本帖
标题:我是斑竹。。。。。。
只看楼主 加入收藏
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:0 
哦。没想到这帖子开到后来还挺有味的~~
2011-08-26 20:52
JZY0801
Rank: 2
等 级:论坛游民
帖 子:25
专家分:36
注 册:2010-12-23
收藏
得分:0 

或许我们总有一天会站在一定的高度来看待某些事!
2011-08-26 20:55
vandychan
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
等 级:贵宾
威 望:18
帖 子:2296
专家分:6418
注 册:2010-8-20
收藏
得分:0 
我觉得很多事情只是你们在自作烦恼
何必执着?

到底是“出来混迟早要还”还是“杀人放火金腰带”?
2011-08-26 22:47
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:0 
我摘出了标准(ISO/IEC 9899:1999 (E))中相当多的与这个问题有关的部分的,应该是足以回答本问题了。
大家可以感受一下,标准是怎么从一种客观的(就是不从实现的)角度描述 C 语言的。

和问题比较相关的主要是 6.7的5 和 6.9的5,前者指出什么样的声明是定义,后者指出定义最多不能超过一个。
6.7的3 主要是说为什么在 main 里不能写两个 int i;

另外,大家可以试试,同样的程序用 g++ 编译会报语法错误。(虽然这点我比较意外吧,但是确实应该这样。)

6.2.2 Linkages of identifiers

2 In the set of translation units and libraries that constitutes an entire program, each
  declaration of a particular identifier with external linkage denotes the same object or
  function. Within one translation unit, each declaration of an identifier with internal
  linkage denotes the same object or function. Each declaration of an identifier with no
  linkage denotes a unique entity.

4 For an identifier declared with the storage-class specifier extern in a scope in which a
  prior declaration of that identifier is visible, if the prior declaration specifies internal or
  external linkage, the linkage of the identifier at the later declaration is the same as the
  linkage specified at the prior declaration. If no prior declaration is visib, or if the prior
  declaration specifies no linkage, then the identifier has external linkage.

5 ... If the declaration of an identifier for an object has file scope and no storage-class specifier,
  its linkage is external.

6 The following identifiers have no linkage: ... a block scope identifier for an object declared without
  the storage-class specifier extern.

6.7 Declarations

3 If an identifier has no linkage, there shall be no more than one declaration of the identifier
  (in a declarator or type specifier) with the same scope and in the same name space, except
  for tags as specified in 6.7.2.3.

4 All declarations in the same scope that refer to the same object or function shall specify
  compatible types.

5 A declaration specifies the interpretation and attributes of a set of identifiers. A definition
  of an identifier is a declaration for that identifier that:
  — for an object, causes storage to be reserved for that object;
  — for a function, includes the function body;
  — for an enumeration constant or typedef name, is the (only) declaration of the
    identifier.

6.9 External definitions

5 An external definition is an external declaration that is also a definition of a function
  (other than an inline definition) or an object. If an identifier declared with external
  linkage is used in an expression (other than as part of the operand of a sizeof operator
  whose result is an integer constant), somewhere in the entire program there shall be
  exactly one external definition for the identifier; otherwise, there shall be no more than
  one.

2011-08-27 01:11
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:0 
翻译一下,以便英语不好的人也能体会体会。
不过这是我自己翻译的,水平有限,而且也没什么权威性,大家随便看看就是了~~
括号里有的是翻译的原文,有的是我自己的补充,大家应该能看出来。

6.2.2 标识符的链接

2  // 主要内容是说外链接和内链接的标识符是用来表记同一个对象或函数的,而无链接的标识符只用来表记唯一的项
  (在这一条中没有提,我补充一下。它的意思是,有些对象或函数可以声明不只一次,这样会引发一些覆盖呀隐藏之类的行为。
   严格意义上讲,覆盖之后同名的标识符并不是同一个对象,这条正是限制了它们的同一性。而无链接的标识符本来就不允许声明
   一次以上,从而事实上,它也只能表记唯一的项。)

4 // 主要内容是说用 extern 声明的标识符,其链接性是看这个标识符前一次出现的情况。前一次是内链接这次这个标识符也是
  内,前一次是外,这次也是外。要是前面没有,或者是不可见,或者是无链接,则这次这个标识符是外链接。

5 ... 如果一个声明对象的标识符拥有文件作用域且没有储存类修饰符(储存类修饰符是指 extern, auto, static, register 这类修饰符),则它是外链接。

6 下列标识符为无链接标识符: ... 没有储存类修饰符的块作用域的对象声明标识符。
  (我省略了一些种类,主要是因为和这个问题没什么关系。)

6.7 声明

3 在同一作用域和同一名空间中,一个无链接的标识符至多声明一次,除非它是标签声明符(这里就是指枚举类型),见 6.7.2.3

4 在同一作用域中,所有引用至同一对象或函数的声明都应指定兼容的类型。

5 声明将指定一组标识符的解释方法和属性(不太好翻译,意思是说声明会告诉编译器如何看待这个标识符)。标识符的定义是满足
  条件的该标识符的声明:
  -- 对于对象,它引发对该对象储存空间的分配。
  -- 对于函数,它包含函数体。
  -- 对于枚举,常量或者 typedef,则(就)是该声明本身。(就是说不用什么其它条件了…)

6.9 外定义

5 外定义就是拥有外链接属性的(非内联)函数定义或对象定义。如果一个外链接标识符被用于表达式(除了 sizeof 运算符,它的
  结果是个整型常量),则程序的其它地方应该当有且仅有该标识符的一个外定义;否则,外定义应当不多于一个。
  (这条其实就是说外定义只能有一个,不过 sizeof 是个例外,在这种情况下,可以一个定义都没有。)


改改错字……


[ 本帖最后由 pangding 于 2011-8-27 02:07 编辑 ]
2011-08-27 01:57
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:0 
求学的时候严谨点我觉得还是有点必要的。不过学这些个文法上的东西,对加深对 C 的认识有点帮助,对提高编程实力帮助不是很大。

我觉得最重要的是自己写程序的时候,最好只写自己能肯定是正确的代码。阅读高质量的开源代码时,多想想,多背背。
不要写自己也不知道是怎么回事的代码。当然编译了几下,摸了个规律就以为就是这样也不是很正确。
不过肯自己动手研究一下的学习方法还是很好的,至少比空想主义或臆测主义要强很多。

遇到问题除了查资料以外,问问别人其实挺不错。正理资料挺费劲的,阅读上下文也需要很长时间,即是像我这样经常看 C/C++ 的标准也是一样。
当然别人回答的质量高不高,结果正不正确也要自己判断一下。不要以讹传讹,以假乱假。


[ 本帖最后由 pangding 于 2011-8-27 02:24 编辑 ]
2011-08-27 02:22
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
收藏
得分:0 
恩,谢谢pangding,这些也是我想说的。

并不是让大家死扣文法,只是要求大家至少在学习C语言的时候,至少直到有这些文法,而不是自己胡乱瞎猜,什么强弱符号什么的。

这些对提升C编程能力的确帮助有限,就像练习正确的姿势对弹吉他能力的提高并没有帮助。但是他们是基础,基础就是说,这些东西是模糊的,会极大地限制你理解程序的能力,极大地限制你编程时的灵活性。当然我指的不是这个小例子,我指的是整个ISO C标准。

这是一种态度,如果对任何知识,比如计算机架构,比如软件工程,比如算法,都有这样的态度,那学不好是不可能的。

专心编程………
飞燕算法初级群:3996098
我的Blog
2011-08-27 09:39
BlueGuy
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:29
帖 子:4476
专家分:4055
注 册:2009-4-18
收藏
得分:0 
不久前做过手机游戏,当时的java代码写的也不规范(现在也不是很排斥,觉得也挺紧凑),很多变量声明在中间,
有个同事移植为c的时候,把所有的变量复制一份到了文件首,后来这恶心的代码由我维护,代码能跑起来
pclint一下出现上千个warning, 我写代码基本没警告的, 哪经的住这架势,
背后骂了几个星期, 靠!

这个问题一直也没深究是什么原因,为什么没报错,


[ 本帖最后由 BlueGuy 于 2011-8-27 09:58 编辑 ]

我就是真命天子,顺我者生,逆我者死!
2011-08-27 09:44
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
收藏
得分:0 
以下是引用BlueGuy在2011-8-27 09:44:29的发言:

不久前做过手机游戏,当时的java代码写的也不规范(现在也不是很排斥,觉得也挺紧凑),很多变量声明在中间,
有个同事移植为c的时候,把所有的变量复制一份到了文件首,后来这恶心的代码由我维护,代码能跑起来
pclint一下出现上千个warning, 我写代码基本没警告的, 哪经的住这架势,
背后骂了几个星期, 靠!

这个问题一直也没深究是什么原因,为什么没报错,


这个不叫不规范,这应该是好习惯。

专心编程………
飞燕算法初级群:3996098
我的Blog
2011-08-27 11:05
vandychan
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
等 级:贵宾
威 望:18
帖 子:2296
专家分:6418
注 册:2010-8-20
收藏
得分:0 
习惯是很重要D 我彻底无语了

到底是“出来混迟早要还”还是“杀人放火金腰带”?
2011-08-27 15:51
快速回复:我是斑竹。。。。。。
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.024643 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved