这样编译时 会出现error:
2.obj : error LNK2005: "unsigned long test" (?test@@3KA) already defined in 1.obj
这是为什么呢?
#ifndef #define #endif
不是可以防止头文件被重复编译,
进一步想 在编译时 是不是以.cpp文件为单位进行的,上述方法只是保证 .cpp内的头文件不被重复包含
后来我做了实验 如上述 不行
我在C1的头文件中加上#include "glo.h"
在C1的CPP中也加上#include "glo.h"
这样C1.CPP包含两个#include "glo.h" 而且"glo.h"中有DWORD 类型的定义
结果是 编译无问题 看来在编译时 是.cpp文件为单位进行的是正确的,即#ifndef #define #endif只在所在的CPP范围内起作用
而且我得出一个结论:
不要在头文件中定义变量,否则 一旦这个头文件包含在多个.CPP时 就会出现上述error
因为同一头文件中变量可以被声明多次,但只能被定义一次。
写directshow程序时,注意在定义guid 时,必须如下: Guidgen.exe , initguid.h , DEFINE_GUID
2008-05-18 16:41
|
// Src1.cpp #include #include "MyGuids.h" // Src2.cpp #include "MyGuids.h" // Src3.cpp #include "MyGuids.h" 其中在MyGuids.h必须使用 DEFINE_GUID(CLSID_MyObject, 0x00000000, 0x0000, 0x0000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00); (Where this example has zeroes, put the actual GUID values.) You can use the Guidgen.exe utility to create a new GUID and paste it 其中initguid.h只能在一个.cpp中包含, DEFINE_GUID()宏定义了,如果包含了一个initguid.h,那么定义一个guid, 如果没有包含一个initguid.h ,则定义一个extern guid指向定义的那个guid, 所以项目中必须有一个文件.cpp包含initguid.h,否则会出错。但如果包含了多个的initguid.h,也会出错
|
本文探讨了C++编程中头文件重复包含导致的问题,特别是全局变量定义引起的链接错误,并给出了预防措施。同时介绍了正确使用预编译头文件的方法及在DirectShow编程中GUID的正确定义方式。
1691

被折叠的 条评论
为什么被折叠?



