多个程序公用一个头文件时头文件的定义是要小心的。容易造成重复定义。
头文件里不要定义变量,采用 extern 声明你的变量和函数。如:
#define HASLABEL 1
#define ISFIELD 0
extern UInt cursor;
//在其他文件里定义
extern Boolean StrIsNum( CharPtr str );
//在其他文件里定义
把函数声明(不是定义)放在公用头文件里不会有什么问题。
而全局变量确实不宜放在header里面定义,如果被多于一个的.c(cpp)引用,就会出现multiple definition。
可以在一个.c里面定义,其它要用的.c前面extern
但如果全局变量太多,也有一个办法可以放在头文件里:
例如有三个.c文件:aaa.c, bbb.c和ccc.c
在all.h里:
#ifndef _defined_here_
#define EXT extern
#else
#define EXT
#endif
EXT int aaa;
EXT float bbb;
...
然后在其中一个.c里加一句
#define _defined_here_
就可以了
另外注意,如:yyy.h yyy.c,在yyy.h中对函数的声明默认就是extern的。
加不加上extern,都无所谓,但是yyy.h定义了的变量,如果这个yyy.h被多个.c调用就会出现重复定义,所以变量放yyy.c中定义,在yyy.h中用extern int xxx外部声明就可以了。还有就是yyy.h中定义的函数同时把函数体也实现了,如:void setB(int a){b=a;},当被多个.c文件引用时也会出现重复定义的错误。。
今天就遇到这个问题,郁闷了半天,终于搞定了,以前都用c++写程序,没大多涉及到函数,全局变量的调用,没注意过这种问题。这些天用c写的代码多了,居然出了一大堆问题,习惯了OO编程,还真不习惯c程序,老觉得不好用。
---下面是在网上搜到的谈到头文件定义问题的一些东西---------------------
例如:
我在程序中建立一个globle.h文件,代码如下:
#ifndef _GLOBLE_H
#define _GLOBLE_H
int a;
int b;
int c;
#endif
有多个.cpp文件引用他,编译的时候说变量重复定义,可是我已经加入了#ifndef这样的语句.
解决方法1:
改成:
#ifndef _GLOBLE_H
#define _GLOBLE_H
extern int a;
extern int b;
extern int c;
#endif
并在其中的一个cpp文件里加上
int a;
int b;
int c;
解决方法2:
/*
* FILENAME: Global.h
* PURPOSE : Global Variabels.
* global 定义前缀使用说明:
* 很多程序将所有的全局变量放在一个文件中定义,然后在另一个头文件中进行
* 声明(加extern修饰). 如var_main.h定义变量,var.h声明变量,这种方法在有
* 大量变量的情况下,可能会造成两个文件不一致,从而引起潜在的问题.
*
* 采用global预编译指令,只要在main.c文件包含其他的头文件之前加入
* #define _MAIN_DEFINE_
* #include "global.h"
* #include "otherfile.h" ,
* 那么编译器将在这个文件中定义变量,在其他文件中只作声明,不会重复定义.
*/
#ifndef _GLOBAL_H_
#define _GLOBAL_H_
#ifdef _MAIN_DEFINE_
#define global
#else
#define global extern
#endif // _MAIN_DEFINE_
////////////////////// 全局类型 /////////////////////////////////
typedef enum
{
E_SUCC = 0,
E_COMM_FAIL = 1,
} ERESULT;
////////////////////// 全局变量 /////////////////////////////////
//// 需要初始化的全局变量
#ifdef _MAIN_DEFINE_
// global int g_nInit = 99;
#else // just extern
// global int g_nInit ;
#endif // _MAIN_DEFINE_
//// 不需要初始化的全局变量
global long g_lTrace;
////////////////////// 全局函数 /////////////////////////////////
void g_fun(void);
#endif // _GLOBAL_H_
当然,如果项目比较大的话,应该把函数申明和类型、结构的定义分别放到其他文件中,再在global.h中引
入,如:
#include "func.h"
#include "macro.h"
#include "struct.h"
阅读(2835) | 评论(0) | 转发(0) |