2006-12-02, 07:36 PM
|
#1
|
|
普通会员
注册日期: 2006-07-21
帖子: 41
精华: 0
现金: 139 金币
资产: 139 金币
声望: 10 
|
如何有效的避免代码中的重复定义[原创]
|
我们在编写程序的时候,经常不知道某个变量或者某个函数有没有被定义过。特别是文件比较多的时候,很容易造成重复定义。重复插入头文件也是不容忽视的问题。比如:
有三个文件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。
这样就有效的避免了变量的重复定义。
|
|
|
|