南方Linux论坛   首页 | 行业 | 下载 | Blog | 桌面应用 | 数据库 | 电子商务 | 文摘 | 网络服务 | 开源 | 系统管理 | 内核代码 | 教程

返回   南方Linux论坛 > Linux 高级应用讨论区 > Linux 程序设计专题讨论
注册账号 Blog 论坛帮助 会员列表 日历事件 搜索 今日新帖 标记讨论区已读

发表新主题 回复
 
主题工具 显示模式
旧 2006-12-02, 07:36 PM   #1
sulilo
级别:1 | 在线时长:5小时 | 升级还需:7小时
普通会员
 
注册日期: 2006-07-21
帖子: 41
精华: 0
现金: 139 金币
资产: 139 金币
声望: 10 sulilo 正向着好的方向发展
默认 如何有效的避免代码中的重复定义[原创]

我们在编写程序的时候,经常不知道某个变量或者某个函数有没有被定义过。特别是文件比较多的时候,很容易造成重复定义。重复插入头文件也是不容忽视的问题。比如:

有三个文件a,b,c;

c 的内容如下
/**************************************************************/
1 #ifndef CYC_GTKWIDGET
2 #define CYC_GTKWIDGET
3 static GtkWidget *cyc_window;
4 static GtkWidget *cyc_frame;
5 static GtkWidget *cyc_notebook;
6 static GtkWidget *table;
7 static GtkWidget *label;
8 #endif
9 struct cyc_size {gint x, y;};
10 struct cyc_size cyc_window_size = {150,400};
11 //static void cyc_set_window_size (){};
12 //static void cyc_get_window_size (){};
13
14 const gchar cyc_title[] = "cyclone";
/**************************************************************/

文件a 需要包含文件b,和文件c,
而文件b 也需要包含文件c.

当你编译文件a 的时候,就会造成文件c的内容重复定义。
代码小的时候我们可以发觉,当文件比较多的时候就难以找到这些问题了。

另外,如果文件a和文件x 只需要3-7行的定义,文件b和文件y 也只需要9-14行的定义。用这种方法最好不过了。

我先介绍下面几个预处理命令

#ifdef 根据否定义宏有条件的包括一些文本
#ifndef 根据#ifdef相反的测试条件的包括一些文本
#endif 终止条件文件

有了这三个命令就很方便的帮我们完成上面所说的任务。
看这几行代码:

1 #ifndef CYC_GTKWIDGET
2 #define CYC_GTKWIDGET
3 static GtkWidget *cyc_window;
4 static GtkWidget *cyc_frame;
5 static GtkWidget *cyc_notebook;
6 static GtkWidget *table;
7 static GtkWidget *label;
8 #endif

第一行的意思是:如果没有定义 CYC_GTKWIDGET,就执行里面的代码
第二行的意思是:定义 CYC_GTKWIDGET
第八行的意思是:结果条件文本

有了这样的定义,当我们编译的文件a的时候,在编译到#include "c"的时候,由于CYC_GTKWIDGET还没有定义,所以#ifndef条件测试为真,则执行#ifndef和 #endif之单的代码。

当编译到包含文件b的时候(#include "b"),由于文件b也包含了文件c。所以还会编译一次文件c里的代码。当再次编译文件c的第一行时,由于前面已经执行一次,宏 CYC_GTKWIDGET已经存在了。这里的#ifndef条件测试将会返回假。然后直接跳出#endif。

这样就有效的避免了变量的重复定义。
sulilo 当前离线  
回复时引用此帖
发表新主题 回复


当前查看此主题的会员: 1 (0 位会员和 1 位游客)
 
主题工具
显示模式

发帖规则
不可以发表新主题
不可以回复主题
不可以上传附件
不可以编辑您的帖子

论坛启用 BB 代码
论坛启用 表情符号
论坛启用 [IMG] 代码
论坛禁用 HTML 代码


所有时间均为北京时间。现在的时间是 02:49 AM


vBulletin 3.6.8 Powered by 南方Linux联盟
版权所有 ©2004 - 2009, bbs.linuxunion.net