c++ primer 里说全局对象的定义不能写在头文件中 是为了防止 头文件被多次包含 造成有多个定义可是头文件中 不是已经有 防止头文件被 多次包含的语句
 #if !defined(AFX_
 #define AFX_
 #endif和 
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000 了吗 那这样 即使是在头文件中定义全局变量 这些宏不是也保证了 该头文件只会被 包含一次 全局变量也只会被定义一次

解决方案 »

  1.   

    你写include的时候 会将那个头文件的内容复制到当前文件
    加入你一个文件被包含两次的话,符号冲突.是编译器用的a文件包含了 一个头文件,b文件包含了一个头文件,这个头文件中有个全局变量
    编译的时候是可以通过的.
    但在链接的时候这个全局变量就存在了两份.这时候连接器就不知道如何做了,于是报错
      

  2.   

    我以前也遇到这种问题的
    我的解决方法如下
    在Cpp文件中定义这个变量
    然后在头文件中加 extern开头 再定义一遍
      

  3.   

    msdn 中是这样 解释#pragma once的Specifies that the file, in which the pragma resides, will be included (opened) only once by the compiler in a build. A common use for this pragma is the following:是防止多次包含
      

  4.   

    如果头文件多次被include
    则全局变量的定义不能写在这个头文件中
    建议写在一个Cpp文件中,
    然后要用时, 加 extern 头, 再声明一下下就可以用了

    在.Cpp中
    int iABC;
    在.h中在写一遍
    extern int iABC;
      

  5.   

    Specifies that the file, in which the pragma resides, will be included (opened) only once by the compiler in a build 这里的in a build 是不是指编译某一个文件 的一次编译我在vc中试了一下 我定义了一个class aa ;
    头文件中去掉了#if !defined(AFX_
     #define AFX_
     #endif和 
    #if _MSC_VER > 1000
    #pragma once
    #endif 然后在doc.h中include "aa.h" view.cpp中include "doc.h 就出现error C2011: 'AA' : 'class' type redefinition 的错误。但是 在doc.cpp中 include "aa.h" view.cpp中 include "aa.h" 编译没问题 实际上"aa.h"在整个工程中还是被包含了两次 为什么就不出错
      

  6.   

    但是 在doc.cpp中 include "aa.h" view.cpp中 include "aa.h" 编译没问题 实际上"aa.h"在整个工程中还是被包含了两次 为什么就不出错在整个工程中被包含两次当然没有错误出错的是在同一个文件中包含同一个文件两次.
    doc.cpp中写两次include "aa.h"你试试看
      

  7.   

    我在vc中试了一下 我定义了一个class aa ;
    ....
    请问这里的 class aa 是不是class的结构阿
    比如
    建个工程, Sample
    就有个 Class CSampleApp这个类
    也有个 CSampleApp theApp;全局变数
    这里的class aa 是类似 theApp 还是CSampleApp
      

  8.   

    然后在doc.h中include "aa.h" view.cpp中include "doc.h 就出现error C2011: 'AA' : 'class' type redefinition 的错误。但是 在doc.cpp中 include "aa.h" view.cpp中 include "aa.h" 编译没问题 实际上"aa.h"在整个工程中还是被包含了两次 为什么就不出错.....
    楼主把代码发给我看看
    [email protected]
      

  9.   

    头文件中放声明,实现文件(.cpp)文件中定义变量。我看搂主没搞清楚变量声明和定义的概念。
      

  10.   

    你写include的时候 会将那个头文件的内容复制到当前文件
    加入你一个文件被包含两次的话,符号冲突.是编译器用的a文件包含了 一个头文件,b文件包含了一个头文件,这个头文件中有个全局变量
    编译的时候是可以通过的.
    但在链接的时候这个全局变量就存在了两份.这时候连接器就不知道如何做了,于是报错
      

  11.   

    Specifies that the file, in which the pragma resides, will be included (opened) only once by the compiler in a build. A common use for this pragma is the following:我现在这样理解will be included (opened) only once by the compiler in a build不知道对不对:
       就是说 in a build 就是一次编译过程 比如编译某个文件 就算一次编译    所以要是 在doc.cpp中 include "aa.h" view.cpp中 include "aa.h" 编译没问题 实际上"aa.h"在整个工程中还是被包含了两次 但是它们是分属于两次编译 所以不会出错  在doc.h中include "aa.h" view.cpp中include "doc.h 在编译view.cpp 文件的时候 就是在同一次编译中 有符号重复 所以出错