在头文件定义全局变量以后

本文探讨了C++编程中头文件重复包含导致的问题,特别是全局变量定义引起的链接错误,并给出了预防措施。同时介绍了正确使用预编译头文件的方法及在DirectShow编程中GUID的正确定义方式。

 

这样编译时 会出现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,也会出错

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值