免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: net_robber
打印 上一主题 下一主题

最近总犯低级错误 [复制链接]

论坛徽章:
7
荣誉版主
日期:2011-11-23 16:44:17子鼠
日期:2014-07-24 15:38:07狮子座
日期:2014-07-24 11:00:54巨蟹座
日期:2014-07-21 19:03:10双子座
日期:2014-05-22 12:00:09卯兔
日期:2014-05-08 19:43:17卯兔
日期:2014-08-22 13:39:09
21 [报告]
发表于 2006-12-23 14:23 |只看该作者
原帖由 zx_wing 于 2006-12-23 14:15 发表


>>宏的危害之一是会污染名字空间。

枚举如何做到不污染名字空间呢?


>>例如,如果在自己的程序中声明了和宏相同名字的变量,可能会造成莫名其妙的编译错误。

如果只是编译和链接时的 ...

这么说只能无语了。

记得那个著名的对乔治.马洛里的采访—— 问:“你为什么要登山?” 答:“因为它就在那儿!”
Beacuse it's there.

论坛徽章:
0
22 [报告]
发表于 2006-12-23 14:27 |只看该作者
原帖由 r2007 于 2006-12-23 14:23 发表

这么说只能无语了。

记得那个著名的对乔治.马洛里的采访—— 问:“你为什么要登山?” 答:“因为它就在那儿!”
Beacuse it's there.


呵呵,我有点刨根问底了哈。
唉,我看书就是这个习惯,再经典的教材,再大牛的人说的话。要是不能给个程序出来解释问题,我就不怎么相信。因为没有程序说明光靠脑袋里面想怎么都觉得靠不住,往往以为是这样子了,放到程序里却发现其实不是这样。

论坛徽章:
0
23 [报告]
发表于 2006-12-23 14:41 |只看该作者
在没有出现问题的时候,任何言论和做法都是正确的。

就好像说杀人可能会牙疼。

谁又来保证不会呢???

存在即是道理

OK,就此结束!

论坛徽章:
0
24 [报告]
发表于 2006-12-23 14:59 |只看该作者
假设出于需要,在程序中添加了位于   /************************/ 之间的一段代码。在修改的代码中,用宏和 enum 定义 X 可给 test() 的执行带来不同的结果。


  1. #include <stdio.h>

  2. int X = 10;

  3. void test();

  4. int main( void )
  5. {
  6.   test();

  7.   /************************/
  8.   /* 后面维护程序的人添加了下列代码 */
  9. #if 1
  10. #define X 100
  11. #else
  12.   enum { X = 100 };
  13. #endif

  14.   printf( "%d\n", X );
  15.   /************************/

  16.   return 0;
  17. }

  18. void test()
  19. {
  20.   printf( "%d\n", X ); /* 写这个函数的人认为他使用的是全局的 X */
  21. }
复制代码

[ 本帖最后由 whyglinux 于 2006-12-23 15:00 编辑 ]

论坛徽章:
0
25 [报告]
发表于 2006-12-23 15:09 |只看该作者
原帖由 whyglinux 于 2006-12-23 14:59 发表
假设出于需要,在程序中添加了位于   /************************/ 之间的一段代码。在修改的代码中,用宏和 enum 定义 X 可给 test() 的执行带来不同的结果。

[code]
#include <stdio.h>

int X = 10 ...


好!这个例子非常明白的说明问题了。
果然还是要用代码才能说明问题。谢了:wink:

论坛徽章:
0
26 [报告]
发表于 2006-12-23 22:44 |只看该作者
一点也不奇怪,你还没我犯错误的低级

  1. if (num == Max);
  2. {
  3.       DoSomething();
  4. }
复制代码


折腾我一个多小时,就是不明白DoSomething()为啥老是执行,最后才知道 if 判断允许空操作


论坛徽章:
0
27 [报告]
发表于 2006-12-26 00:29 |只看该作者
if (num == Max);
{
      DoSomething();
}
这大概是很多写程序的人常犯的错误了
if (num == Max) {
    DoSomething();
}
这种风格也许会少犯些这样的错误

论坛徽章:
0
28 [报告]
发表于 2006-12-26 10:14 |只看该作者
原帖由 bierdaci 于 2006-12-26 00:29 发表
if (num == Max);
{
      DoSomething();
}
这大概是很多写程序的人常犯的错误了
if (num == Max) {
    DoSomething();
}
这种风格也许会少犯些这样的错误



我还是喜欢
if (num == Max)
{
      DoSomething();
}
这种风格。

论坛徽章:
0
29 [报告]
发表于 2006-12-26 10:50 |只看该作者
原帖由 whyglinux 于 2006-12-23 14:59 发表
假设出于需要,在程序中添加了位于   /************************/ 之间的一段代码。在修改的代码中,用宏和 enum 定义 X 可给 test() 的执行带来不同的结果。

[code]
#include <stdio.h>

int X = 10 ...



版主内功深厚啊......................................

论坛徽章:
0
30 [报告]
发表于 2006-12-26 11:28 |只看该作者
whyglinux ,很高兴你能提出你的见解,我认为能在一个程序论坛能如此激烈和深刻的讨论一个问题是多么的美好,就像CSDN那种教学站点,我是实在没什么兴趣和他们唠叨,对于你提出的反驳相当的中肯和犀利,你所说的我认为很是正确,当然对于宏,我想我们应该采取容忍的态度,相信我,这不是试图说服你或者其他人要在怎么作,而是通过这种友善的争论——就像XP团队的第二条理念所说的:XP团队的程序员是要通过争论,甚至是面红耳赤的场面来讨论问题的,因为那就像头脑风暴一样有效。
曾经当我在vxWorks下编程时,我不小心看到了他的源代码的实现,我被其中巧妙的宏使用所吸引
知道后来我为PDA编写基于Wince的程序时,在C#环境下进行工作,我使用了大量的const来定义常量,我不得不说这两中方式都很棒,都是保证我的程序能轻易延展的好的方法。
当然,有一天,我为msp430和f020编写代码的时候我发现,硬件工程师告知我,由于其核心代码太大,留给我为GPRS编写驱动程序所需的内存空间仅有1K时,我不得不尽量的试图减少我对内存的扩展使用,那么当我的工作进行到最后发现内存还需要40bits时,我不得不尝试把所有常量的定义改为了enmu,这其实是个很好的主义,但是对于GPRS中需要的大量String信息,我还是不得不用#define来代替……或者这实在说明不了什么,因为我确实在其后的日子里在PC上编译程序时,我仍是很理智和谨慎的使用着C++中的template(我的系统STL大量使用)的同时,更习惯的使用了const定义,还是像原来那么美妙。
那么,#define就像他曾经存在过一样,我用他解决这问题,const却是像现在一样,是我的首选。
或者更多时候,我的程序——也不排斥任何能实现目的的设想
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP