如何解决重复定义问题error LNK2005: "***" (?inta@@3HA) already defined

ldxab 2014-03-15 08:58:57
在一个MFC自动生成的对话框工程里随便添加一个头文件testdefH.h,如下:

#ifndef testdefH_def
#define testdefH_def
int inta;
int ReturnA();
#endif

在其cpp文件中引用头文件,cpp文件如下:
#include"stdafx.h"
#include "testdefH.h"
int ReturnA()
{
return inta;
}

在MFC自动生成的对话框cpp文件中(testdefDlg.cpp)引用该头文件,其余代码不做任何改动:
#include "stdafx.h"
#include "testdef.h"
#include "testdefDlg.h"
#include "testdefH.h"

编译后报错:

--------------------Configuration: testdef - Win32 Debug--------------------
Linking...
testdefCPP.obj : error LNK2005: "int inta" (?inta@@3HA) already defined in testdefDlg.obj
Debug/testdef.exe : fatal error LNK1169: one or more multiply defined symbols found
Error executing link.exe.

testdef.exe - 2 error(s), 0 warning(s)


对于上面的错误我觉得很纳闷,我已经在testdefH.h头文件中加入防重复定义的语句了啊,如下:
#ifndef testdefH_def
#define testdefH_def
#endif
按理讲应该该头文件只定义一次,为什么还会出现重复定义??
...全文
266 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
buyong 2014-03-17
  • 打赏
  • 举报
回复
#ifndef testdefH_def #define testdefH_def extern int inta; int ReturnA(); #endif 然后在一个cpp里: int inta;
  • 打赏
  • 举报
回复
引用 6 楼 ldxab 的回复:
[quote=引用 4 楼 baichi4141 的回复:] #ifdef并不是你想象的那个作用 它用于防止一个头文件在一个源文件里被多次包含,并不能阻止一个头文件在多个源文件里被包含——当然也没理由阻止 重复定义,是“多个源文件中有同名的全局变量” 虽然我知道你是想要“多个源文件都能访问同一个全局变量”,但那必须使用extern
#ifdef作用竟然是防止在一个CPP文件里多次引用头文件,这个看来是我之前的理解都是错的,那如果是多个源文件都使用一个全局变量,就只有extern声明了?[/quote] 是的
ldxab 2014-03-17
  • 打赏
  • 举报
回复
引用 4 楼 baichi4141 的回复:
#ifdef并不是你想象的那个作用 它用于防止一个头文件在一个源文件里被多次包含,并不能阻止一个头文件在多个源文件里被包含——当然也没理由阻止 重复定义,是“多个源文件中有同名的全局变量” 虽然我知道你是想要“多个源文件都能访问同一个全局变量”,但那必须使用extern
#ifdef作用竟然是防止在一个CPP文件里多次引用头文件,这个看来是我之前的理解都是错的,那如果是多个源文件都使用一个全局变量,就只有extern声明了?
baichi4141 2014-03-17
  • 打赏
  • 举报
回复
简单地说,不要想当然,你写的语句并不是你以为的那个功能,就这样
baichi4141 2014-03-17
  • 打赏
  • 举报
回复
#ifdef并不是你想象的那个作用 它用于防止一个头文件在一个源文件里被多次包含,并不能阻止一个头文件在多个源文件里被包含——当然也没理由阻止 重复定义,是“多个源文件中有同名的全局变量” 虽然我知道你是想要“多个源文件都能访问同一个全局变量”,但那必须使用extern
翅膀又硬了 2014-03-17
  • 打赏
  • 举报
回复

int ReturnA()
{
extern int inta;
return inta;
}
ldxab 2014-03-17
  • 打赏
  • 举报
回复
int inta;放到cpp中可以解决问题,但是 别的许多CPP文件都可能用到inta变量,也就可以直接包含该头文件,如果放在CPP中就不是太好(虽然仍然可以通过extern声明处理) 我现在想这道像我这种方式为什么会导致重复定义,因为我已经有了ifndef语句了????????
帅得不敢出门 2014-03-15
  • 打赏
  • 举报
回复
int inta;放到cpp中

64,649

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧