读书人

为何会重定义呢

发布时间: 2013-09-05 16:02:07 作者: rapoo

为什么会重定义呢?
stdafx.h 包含了
#include "Global.h"
#include "externs.h"

Global.h :
#pragma once

LPWSTR pSysDir = NULL;
LPWSTR pAppDir = NULL;


externs.h:
#pragma once

extern LPWSTR pSysDir;
extern LPWSTR pAppDir;

连接的时候就出现了:
inject.obj : error LNK2005: "unsigned short * pSysDir" (?pSysDir@@3PAGA) 已经在 stdafx.obj 中定义
inject.obj : error LNK2005: "unsigned short * pAppDir" (?pAppDir@@3PAGA) 已经在 stdafx.obj 中定义

[解决办法]
那你就不要在头文件中定义
extern LPWSTR pSysDir;
extern LPWSTR pAppDir;
[解决办法]

引用:
Quote: 引用:

LPWSTR pSysDir = NULL;
LPWSTR pAppDir = NULL;
这放到工程的其中一个CPP或者C文件中才对

stdafx.h 包含了 #include "Global.h",而在多个CPP或者C文件中#include "stdafx.h",当然重定义了

但是我加了 pragma once 啊

我也是看了网上说的全局变量的方法才这样使用的


#pragma once 只是避免在同一个CPP或者C文件中多次#include同一个头文件,不是说在一个CPP或者C文件中#include了,再在其它CPP或者C文件中#include就不起作用,因为每个CPP或者C文件都是单独编译的。

加了extern的是声明,不是定义;同一个变量声明可以多次,定义只能一次
extern LPWSTR pSysDir;extern LPWSTR pAppDir; 可以放到头文件
LPWSTR pSysDir = NULL; LPWSTR pAppDir = NULL;不要放到头文件

读书人网 >VC/MFC

热点推荐