免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 9854 | 回复: 51

[C] 为什么这样子不报错,或者给一个什么警告也好? [复制链接]

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
发表于 2011-10-29 23:41 |显示全部楼层
  1. #include <stdio.h>

  2. struct scul_qset {
  3.         int data;
  4.         struct scul_qset* next;
  5. };

  6. int main()
  7. {
  8.         int scul_qset;
  9.         struct scul_qset scul_qset_instance;
  10.         return 0;
  11. }
复制代码
int scul_qset; /* 定义一个和结构标识符相同的变量 */

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
发表于 2011-10-30 00:12 |显示全部楼层

  1. void x(void)
  2. {
  3.       struct x { struct x* x; } x;
  4. x:
  5.       x.x = &x;
  6. }
复制代码
有一种…… "要是吐槽就输了"的感觉 >_<

论坛徽章:
5
技术图书徽章
日期:2013-11-07 13:21:58技术图书徽章
日期:2013-12-07 10:34:46技术图书徽章
日期:2014-04-23 08:50:31双鱼座
日期:2014-09-16 09:12:34亥猪
日期:2015-01-23 13:37:49
发表于 2011-10-30 00:31 |显示全部楼层
所有这些不在一个概念域中。或者说不在一个名字空间中。从编译器的实现上说他们分属于不同的符号表。

OW吐槽啊,俺就稀饭看你吐槽。

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
发表于 2011-10-30 00:43 |显示全部楼层
回复 3# nketc

C语言已经是这样子了……  吐也没用……

struct x x; 这种代码倒是经常在一些老的书籍或代码里看见……  这也就算了……
还不如去吐槽那些尽可能"利用"名字空间将人搞晕的代码……

论坛徽章:
5
技术图书徽章
日期:2013-11-07 13:21:58技术图书徽章
日期:2013-12-07 10:34:46技术图书徽章
日期:2014-04-23 08:50:31双鱼座
日期:2014-09-16 09:12:34亥猪
日期:2015-01-23 13:37:49
发表于 2011-10-30 00:48 |显示全部楼层
有时候名字不好起啊。写代码有不少时间都花在怎样给函数,变量,类型命名上了。nnd有时候写测试代码的时候,直接xxx1,xxx2就上了。

论坛徽章:
0
发表于 2011-10-30 00:52 |显示全部楼层
回复 5# nketc

同,还有写注释也花了一些时间。
但是要论起来化在设计/调整设计上的时间还是最多的。

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
发表于 2011-10-30 00:57 |显示全部楼层
回复 5# nketc

>> 有时候名字不好起啊。写代码有不少时间都花在怎样给函数,变量,类型命名上了。
同感……


>> nnd有时候写测试代码的时候,直接xxx1,xxx2就上了。
我有时候会出现这种状况……

  1. {
  2. // ...
  3.       {
  4.       // ...
  5.             {
  6.             // ...

  7. // 层次太深
  8. // 于是这里干脆从顶重新开始……
  9. {
  10. // ...
复制代码
估计会被很多卫道士反对……
管他呢…… 测试代码而已……

论坛徽章:
5
技术图书徽章
日期:2013-11-07 13:21:58技术图书徽章
日期:2013-12-07 10:34:46技术图书徽章
日期:2014-04-23 08:50:31双鱼座
日期:2014-09-16 09:12:34亥猪
日期:2015-01-23 13:37:49
发表于 2011-10-30 01:01 |显示全部楼层
俺没写过啥复杂的算法,注释一般比较简略。好的命名和排版啥的本身就是注释
当然写算法就另当别论了。

ps-----------
1)看别人代码犯困
2)写代码精神
3)查bug,带劲。

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
发表于 2011-10-30 01:14 |显示全部楼层
回复 1# L_kernel

无论是好是坏…… C语言已经成这个样子了……
趁着首页还在, 还是正经回复一下吧……


同一个名字/标识符,可以指代不同的东西 —— 无论是否应该这样编写代码 —— 这个应该是蛮常见的。比如:

  1. void f(void)
  2. {
  3.                           /* ^ */     /* ^ */
  4.       int x,y;            /* | */     /* | */
  5.                           /* A */     /*   */
  6.                           /* | */     /*   */
  7.                           /* v */     /*   */

  8.       {                   /* ^ */     /*   */
  9.             double x,z;   /* | */     /*   */
  10.                           /* B */     /* C */
  11.                           /* | */     /*   */
  12.       }                   /* v */     /*   */

  13.                           /* ^ */     /*   */
  14.                           /* | */     /*   */
  15.                           /* A */     /*   */
  16.                           /* | */     /* | */
  17.                           /* v */     /* v */
  18. }
复制代码
在C范围内, y 指代那个 int 变量。
在(两个)A范围内, x 指代那个 int 变量
而中间的B范围内, x 指代那个double变量。 z指代另一个double变量。

这是通过名字出现的位置决定名字指代物。


而 struct x x; 是另一种情况。
是通过名字的种类/作用决定名字的指代物。

  1. struct    /* 有了 struct "前缀" 后续的 */
  2.        x  /* 就是指一个 tag 而不是别的东西 */
  3.           /* 之后的 */
  4.        x  /* 就是一个普通标识符 */
  5.        ;  /* 两者不会冲突 */

  6. x :       /* x 指 label 同样不会冲突 */
复制代码
PS:
对 lable 是函数作用域而不是块作用域感到惊讶的同学,可以问问使用js的同学是什么感受……
对 C语言区分ordinary/member/tag/label 感到惊讶的同学,可以参考lisp-1与lisp-2之间争论。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
发表于 2011-10-30 09:46 |显示全部楼层
回复  L_kernel

无论是好是坏…… C语言已经成这个样子了……
趁着首页还在, 还是正经回复一下吧…… ...
OwnWaterloo 发表于 2011-10-30 01:14
感谢回复。说得这么多。困扰我的正是这种
struct x x {};的情况。名字空间这个倒不是我发帖子的目的,不好意思,帖的代码很烂。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

DTCC2020中国数据库技术大会

【架构革新 高效可控】2020年12月21日-23日第十一届中国数据库技术大会将在北京隆重召开。

大会设置2大主会场,20+技术专场,将邀请超百位行业专家,重点围绕数据架构、AI与大数据、传统企业数据库实践和国产开源数据库等内容展开分享和探讨,为广大数据领域从业人士提供一场年度盛会和交流平台。

http://dtcc.it168.com


大会官网>>
  

北京盛拓优讯信息技术有限公司. 版权所有 16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122
中国互联网协会会员  联系我们:huangweiwei@it168.com
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP