打印

头文件定义的问题-解决重复定义[转]

[复制链接]
2450|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
暗室无线|  楼主 | 2011-11-20 14:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
多个程序公用一个头文件时头文件的定义是要小心的。容易造成重复定义。
头文件里不要定义变量,采用 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"

我的解决办法
因为要初始化变量,最后是这样的
在.h文件中初始化,但加上static
在.c文件中只定义,但加上extern

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

135

帖子

1

粉丝