|
发表于 2008-4-1 21:47:25
|
显示全部楼层
变量定义不能或者说不应该定义在.h文件中,例如 有 a.h,里面定义了变量 int temp; 如下:
// a.h
#ifndef _a_h_
#define _a_h_
int temp; // define varible
#endif
// 工程包含两个模块 a.c ,b.c
//--------b.c----------
#include"a.h"
...
//显然编译器编译b.c的时候符号_a_h_没有定义,则temp 变量在b.c里定义了一次
// -------a.c ----------
#include "a.h"
//编译器是独立编译b.c和a.c的,甚至编译顺序都是不确定的,所以编译器编译每个.c文件的时候符号定义都是独立的,
//这时候,仍然 没有定义 _a_h_ 这个符号,则文件a.h再次被a.c包含, temp变量再次定义,但编译仍然没有问题.
// 下面链接器link开始工作,链接b.obj和a.obj,结果有两个temp变量 ,link error!
不知道楼主的问题是不是这个原因?
另外:
#ifndef #define ,else ,... #endif 结构是用来避免以下情况的重复包含的,而不是为上面所说情况准备的
--------------------------------------------------------------
//--- a.h
#ifndef _a_h
#define _a_h
declaration in a
#endif
// end of a.h
------------------------------------------------------------------
//---- b.h
#ifndef _b_h
#define _b_h
#include "a.h" // 注意这里
declaration in b
#endif
// end of b.h
---------------------------------------------------------
//---a.c
#include "a.h"
#include "b.h"
// end of a.c
展开为以下内容:
------------------------------------------------------------
#ifndef _a_h
#define _a_h
declaration in a //定义了 符号 _a_h
#endif
#ifndef _b_h
#define _b_h
#ifndef _a_h // 已经定义了 _a_h
#define _a_h
declaration in a // 这行才是重复的,失去作用了
#endif
declaration in b // b.h中的声明
#endif |
|