免费注册 查看新帖 |

Chinaunix

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

【八仙过海,各显神通】大家把平时编程时用的技巧,都贴上来吧! [复制链接]

论坛徽章:
0
31 [报告]
发表于 2004-08-17 21:50 |只看该作者

【八仙过海,各显神通】大家把平时编程时用的技巧,都贴上来吧!

printf("int %d string %s char %c"
         Name_d,Name_s,Name_c
         );

论坛徽章:
0
32 [报告]
发表于 2004-08-24 13:41 |只看该作者

【八仙过海,各显神通】大家把平时编程时用的技巧,都贴上来吧!

我是在MAKEFILE里这样写:
ifeq ($(MAKEFLAG),debug)
   DEBUGFLAG=-DDEBUG
endif
CFLAGS= -g -O0  -Wall
TARGET=../bin/mailagent
OBJS= mailagent.o ../lib/dblib.a store.o
CC=g++

all(TARGET)
$(TARGET): $(OBJS) *h
   $(CC) $(CFLAGS)  -o $(TARGET) $(OBJS)  -L $(ORACLE_HOME)/lib -lclntsh

.cpp.o:
   $(CC) -c $(CFLAGS) $(DEBUGFLAG) -o $@ $< -I $(ORACLE_HOME)/rdbms/demo -I/$(ORACLE_HOME)/rdbms/public -I/$(
ORACLE_HOME)/network/public

而在测试机的.bash_profile里设置MAKEFLAG=debug,在生产机上不设置这个选项,这样,测试机编译后每个文件就相当于加了#define DEBUG,而在生产机编译就相当于没加#define DEBUG

论坛徽章:
0
33 [报告]
发表于 2004-08-25 12:17 |只看该作者

【八仙过海,各显神通】大家把平时编程时用的技巧,都贴上来吧!

原帖由 "flw" 发表:


#define swap(x,y) {int temp = x; x = y; y = temp;}

可是在用到这个宏的时候,我们经常这么用

swap(x,y);
,注意后面的;号,在把宏展开的时候就会出问题,可是如果我们这么写,就可以避免这个问题了:

#define swap(x,y) \
do {int temp = x; x = y; y = temp;} while(0)


很精辟得用法,避免了语法错误。经典!

论坛徽章:
0
34 [报告]
发表于 2004-08-25 12:25 |只看该作者

【八仙过海,各显神通】大家把平时编程时用的技巧,都贴上来吧!

原帖由 "converse" 发表:


我在看一个大的开源项目的时候确实看到这样的代码,把常量放在左边,变量放在右边,开始不明白什么意思,今天明白了


我也明白了。

论坛徽章:
0
35 [报告]
发表于 2004-08-25 13:16 |只看该作者

【八仙过海,各显神通】大家把平时编程时用的技巧,都贴上来吧!

原帖由 "yeath" 发表:
我是在MAKEFILE里这样写:
ifeq ($(MAKEFLAG),debug)
   DEBUGFLAG=-DDEBUG
endif
CFLAGS= -g -O0  -Wall
TARGET=../bin/mailagent
OBJS= mailagent.o ../ctapi/libsms.a store.o
CC=g++

all(TARGET)
$..........

更专业
不过一般#define代码也就好了

论坛徽章:
0
36 [报告]
发表于 2004-08-25 13:47 |只看该作者

【八仙过海,各显神通】大家把平时编程时用的技巧,都贴上来吧!

原帖由 "odin_free" 发表:

更专业
不过一般#define代码也就好了

这样我就不用去修改程序的源文件,减少错误(经常忽视屏蔽#define DEBUG)。

论坛徽章:
0
37 [报告]
发表于 2004-08-29 23:00 |只看该作者

【八仙过海,各显神通】大家把平时编程时用的技巧,都贴上来吧!

[quote]原帖由 "yunfan" 发表:
不知大家是否写过这样的代码,我是犯过这样的错误的
if( a=5) ......   ,其实我们是想写 if( a ==5).....

这样的问题还不容易看出来, 当然如果你从没有出过这种错误,就当我白说了

现在很多人把if语句都这

论坛徽章:
0
38 [报告]
发表于 2004-09-01 15:31 |只看该作者

【八仙过海,各显神通】大家把平时编程时用的技巧,都贴上来吧!

写代码的时候的优先级列表 我也刚刚开始 取自write clean code
Steve maguire 著
Microsoft Press 出版


  1. 吉尔的优先级列表        
  2.                         
  3.      正确性              
  4.                         
  5.      可测试性            
  6.                         
  7.      全局效率            
  8.                         
  9.      可维护性 / 明晰性   
  10.                         
  11.      一致性              
  12.                         
  13.      大小               
  14.                         
  15.      局部效率            
  16.                         
  17.      个人表达方式        
  18.                         
  19.      个人方便性         
  20.       
复制代码

论坛徽章:
0
39 [报告]
发表于 2004-09-01 15:37 |只看该作者

【八仙过海,各显神通】大家把平时编程时用的技巧,都贴上来吧!

同样的地方

  1. 一般问题

  2. ── 你是否为程序建立了DEBUG版本?

  3. ── 你是否将发现的错误及时改正了?

  4. ─一 你是否坚持彻底测试代码.即使耽误了进度也在所不惜?

  5. ── 你是否依靠测试组为你测试代码?

  6. ─一 你是否知道编码的优先顺序?

  7. ─一 你的编译程序是否有可选的各种警告?



  8. 关于将更改归并到主程序

  9. ─一 你是否将编译程序的警告(包括可选的)都处理了?

  10. ── 你的代码是否未用Lint

  11. ─一 你的代码进行了单元测试吗?

  12. ─一 你是否逐步通过了每一条编码路径以观察数据流?

  13. ─一 你是否逐步通过了汇编语言层次上的所有关键代码?

  14. ── 是否清理过了任何代码?如果是,修改处经过彻底测试了吗?

  15. ─一 文档是否指出了使用你的代码有危险之处?

  16. ── 程序维护人员是否能够理解你的代码?



  17. 每当实现了一个函数或子系统之时

  18. ─一 是否用断言证实了函数参数的有效性?

  19. ─一 代码中是否有未定义的或者无意义的代码?

  20. ─一 代码能否创建未定义的数据?

  21. ─一 有没有难以理解的断言?对它们作解释了没有?

  22. ─一 你在代码中是否作过任何假设?

  23. ─一 是否使用断言警告可能出现的非常情况?

  24. ─一 是否作过防御性程序设计?代码是否隐藏了错误?

  25. ─一 是否用第二个算法来验证第一个算法?

  26. ─一 是否有可用于确认代码或数据的启动(startup)检查?

  27. ─一 代码是否包含了随机行为?能消除这些行为吗?

  28. ── 你的代码若产生了无用信息,你是否在DEBUG代码中也把它们置为无用信息?

  29. ── 代码中是否有稀奇古怪的行为?

  30. ── 若代码是子系统的一部分,那么你是否建立了一个子系统测试?

  31. ── 在你的设计和代码中是否有任意情况?

  32. ── 即使程序员不感到需要,你也作完整性检查吗?

  33. ── 你是否因为排错程序太大或太慢,而将有价值的DEBUG测试抛置一边?

  34. ── 是否使用了不可移植的数据类型?

  35. ─一 代码中是否有变量或表达式产生上溢或下溢?

  36. ── 是否准确地实现了你的设计?还是非常近似地实现了你的设计?

  37. ── 代码是否不止一次地解同一个问题?

  38. ── 是否企图消除代码中的每一个if语句?

  39. ── 是否用过嵌套?:运算符?

  40. ── 是否已将专用代码孤立出来?

  41. ── 是否用到了有风险的语言惯用语?

  42. ─一 是否不必要地将不同类型的运算符混用?

  43. ── 是否调用了返回错误的函数?你能消除这种调用吗?

  44. ─一 是否引用了尚未分配的存储空间?

  45. ─一 是否引用已经释放了的存储空间?

  46. ── 是否不必要地多用了输出缓冲存储?

  47. ── 是否向静态或全局缓冲区传送了数据?

  48. ── 你的函数是否依赖于另一个函数的内部细节?

  49. ── 是否使用了怪异的或有疑问的C惯用语?

  50. ── 在代码中是否有挤在一行的毛病?

  51. ── 代码有不必要的灵活性吗?你能消除它们吗?

  52. ─一 你的代码是经过多次“试着”求解的结果吗?

  53. ─一 函数是否小并容易测试?



  54. 每当设计了一个函数或子系统后

  55. ─一 此特征是否符合产品的市场策略?

  56. ─一 错误代码是否作为正常返回值的特殊情况而隐藏起来?

  57. ─一 是否评审了你的界面,它能保证难于出现误操作吗?

  58. ─一 是否具有多用途且面面俱到的函数?

  59. ─一 你是否有太灵活的(空空洞洞的)函数参数?

  60. ─一 当你的函数不再需要时,它是否返回一个错误条件?

  61. ─一 在调用点你的函数是出易读?

  62. ─一 你的函数是否有布尔量输入?



  63. 修改错误之时

  64. ── 错误无法消失,是否能找到错误的根源?

  65. ─一 是修改了错误的真正根源,还是仅仅修改了错误的症状?
复制代码

论坛徽章:
0
40 [报告]
发表于 2004-09-14 13:36 |只看该作者

【八仙过海,各显神通】大家把平时编程时用的技巧,都贴上来吧!

原帖由 "loef" 发表:

[quote]原帖由 "flw" 发表:

而且在宏里使用的do {}while(0)技巧同样值得注意,比如说我们定义了一个宏如下:

#define swap(x,y) {int temp = x; x = y; y = temp;}

可是在用到这个宏的时候,我们经常这么用

swap(x,y);

,注意后面的;号,在把宏展开的时候就会出问题,可是如果我们这么写,就可以避免这个问题了:

#define swap(x,y) \
do {int temp = x; x = y; y = temp;} while(0)


很精辟得用法,避免了语法错误。经典![/quote]

其实 flw 和 loef 说的是不正确的。

swap(x,y); 用第一个宏定义展开后是 {int temp = x; x = y; y = temp;}; ,这个语句最后面的 ; 不会引起错误,因为在这里它是空语句。swap(x, y); 以及 swap(x, y) 的使用形式都是可以的,后者这种使用形式有可能使 swap(x, y) 作为操作数参与表达式的运算(当然这里是不允许的,因为 {} 的存在。如果是这种形式:#define SUM(x, y) ((x) + (y)) 就可以作为操作数使用了)。

由于第二种形式的宏定义是用 do while 语句来实现的,所以它只能这样使用:swap(x, y);,不能这样使用 swap(x, y),即必须在宏调用的后面加一个 ; 才行,这是由 do while 语句的语法决定的。可见,这样做禁止了 swap(x, y) 的使用。

那么这样做的目的何在?上面已经提到过了:它是依靠 do while 的语法规定保证了宏的使用形式是 swap(x, y);,不能是 swap(x, y),从而从语法上制约了这个宏不能作为操作数来使用,就象是返回值类型为 void 的函数一样。

当然,实现这一目的还可以使用 do while 之外其它手段,如第一种宏定义形式中 {} 的使用,使它实际上也不能作为操作数来使用。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP