c++ primer 里说全局对象的定义不能写在头文件中 是为了防止 头文件被多次包含 造成有多个定义可是头文件中 不是已经有 防止头文件被 多次包含的语句
#if !defined(AFX_
#define AFX_
#endif和
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000 了吗 那这样 即使是在头文件中定义全局变量 这些宏不是也保证了 该头文件只会被 包含一次 全局变量也只会被定义一次
#if !defined(AFX_
#define AFX_
#endif和
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000 了吗 那这样 即使是在头文件中定义全局变量 这些宏不是也保证了 该头文件只会被 包含一次 全局变量也只会被定义一次
加入你一个文件被包含两次的话,符号冲突.是编译器用的a文件包含了 一个头文件,b文件包含了一个头文件,这个头文件中有个全局变量
编译的时候是可以通过的.
但在链接的时候这个全局变量就存在了两份.这时候连接器就不知道如何做了,于是报错
我的解决方法如下
在Cpp文件中定义这个变量
然后在头文件中加 extern开头 再定义一遍
则全局变量的定义不能写在这个头文件中
建议写在一个Cpp文件中,
然后要用时, 加 extern 头, 再声明一下下就可以用了
如
在.Cpp中
int iABC;
在.h中在写一遍
extern int iABC;
头文件中去掉了#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"在整个工程中还是被包含了两次 为什么就不出错
doc.cpp中写两次include "aa.h"你试试看
....
请问这里的 class aa 是不是class的结构阿
比如
建个工程, Sample
就有个 Class CSampleApp这个类
也有个 CSampleApp theApp;全局变数
这里的class aa 是类似 theApp 还是CSampleApp
楼主把代码发给我看看
[email protected]
加入你一个文件被包含两次的话,符号冲突.是编译器用的a文件包含了 一个头文件,b文件包含了一个头文件,这个头文件中有个全局变量
编译的时候是可以通过的.
但在链接的时候这个全局变量就存在了两份.这时候连接器就不知道如何做了,于是报错
就是说 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 文件的时候 就是在同一次编译中 有符号重复 所以出错