我在一个MFC工程中创立了一个头文件,用于定义一些全局变量
在头文件中我是这样写的
//global.h
#inndef GLOBAL_H
#define GLOBAL_H
int g_i;
#endif//GLOBAL_H然后再CMyView.cpp文件中包含了这个头文件
//CMyView.cpp
include "stdafx.h"
include "CMyView.h"
include "CMyDoc.h"
include "global.h"然后再CMyDoc.cpp文件中包含了这个头文件
//CMyDoc.cpp
include "stdafx.h"
include "CMyDoc.h"
include "global.h"但是链接的时候出现错误:
error LNK2005: "int i" (?i@@3HA) already defined in MyDoc.obj
请问错误出在哪里呢?谢谢!

解决方案 »

  1.   

    //global.h
    #ifndef GLOBAL_H      //ifndef
    #define GLOBAL_H
    int g_i;
    #endif//GLOBAL_H
      

  2.   

    在global.cpp中定义:int g_i;
    在global.h中:extern int g_i;
      

  3.   

    //global.h
    #ifndef GLOBAL_H      //ifndef
    #define GLOBAL_H
    int g_i;
    #endif//GLOBAL_H//global.cpp
    #include "global.h"
    extern int g_i;
      

  4.   

    先谢谢各位
    请问flyelf(空谷清音)和Mackz(在相互):
     为什么一个变量不能直接在头文件中定义,然后在别的文件中直接调用
     却一定要建立一个cpp文件,再用extern关键字声明呢
      

  5.   

    原来我们两个答复时间是一样的!如果空谷兄看到我的答复应该不会出错了。
    至于为什么,要问发明C语言的人了。看看MFC框架中theApp的定义就是这样。
      

  6.   

    up一下,变量定义不能只放在头文件中吗?include guard不就是防止重复编译的吗?
      

  7.   

    变量定义与类型定义不同。
    这个与链接器(linker)有关.
      

  8.   

    C/C++中每个.C/.CPP文件都会被独立编译,形成一个.obj文件(windows下)。include的作用是把头文件与.cpp文件连接成一个大的完整的文件进行编译。所以如果你把全局变量定义在头文件里,那么每个obj模块中都会有一份该全局变量的空间,所以链接的时候就因为重名而出错了。
        正确的做法应该是如上面几位所说的,把全局变量的定义写在.cpp文件里,其它要引用它们的.cpp文件可以用extern来声明一下。如果变量比较多的话,就可以放在一个.h文件里。
      

  9.   

    回复人: DentistryDoctor(My heart will fly,in the sky.) ( ) 信誉:182  2005-09-01 12:58:00  得分: 0  
     
     
       变量定义与类型定义不同。
       这个与链接器(linker)有关.
    -----------------------------------------------------------------------
    是不是说如果在一个头文件中建立了一个类,include guard就可以防止重复编译?
    而在头文件中定义的全局变量,include guard是不起作用的?