Chinaunix首页 | 论坛 | 博客
  • 博客访问: 373248
  • 博文数量: 81
  • 博客积分: 4016
  • 博客等级: 上校
  • 技术积分: 800
  • 用 户 组: 普通用户
  • 注册时间: 2006-03-17 18:38
文章分类

全部博文(81)

文章存档

2016年(5)

2015年(2)

2010年(1)

2008年(1)

2007年(4)

2006年(68)

我的朋友

分类: LINUX

2006-04-03 19:56:08

多个程序公用一个头文件时头文件的定义是要小心的。容易造成重复定义。
头文件里不要定义变量,采用 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) |
给主人留下些什么吧!~~