.obj 中定义的 c++ 多个
Posted
技术标签:
【中文标题】.obj 中定义的 c++ 多个【英文标题】:c++ multiple defined in .obj 【发布时间】:2017-08-01 05:55:41 【问题描述】:所以我有 3 个 MFC 对话框:
-
Dialog1 - 主对话框
Dialog2 - Dialog1 的子对话框
Dialog3 - Dialog2 的子对话框
XXXResourceFile.h - Dialog2 和 Dialog3 使用的资源文件;仅包含资源(宏常量、仅在文件中使用的 typedef 结构和 typedef 结构的数组);没有课
在 Dialog1 中,我需要 Dialog2 的引用(用于显示窗口/模态)。
在 Dialog2 中,我需要 Dialog1(用于调用 GetParent())和 3(用于显示窗口/模态)的引用
在 Dialog3 中,我需要 Dialog1 和 2 的引用(用于调用 GetParent()/GetAncestor())
当前设计:
//Dialog1.h - by co-dev
...
#include Dialog2.h"
...
//Dialog2.cpp - by co-dev
...
#include "Dialog2.h"
#include "XXXResourceFile.h"
#include "Dialog1.h"
#include "Dialog3.h"
...
//Dialog3.cpp - my initial code/design
...
#include "Dialog3.h"
#include "Dialog2.h"
#include "Dialog1.h"
#include "XXXResourceFile.h"
我的理想设计:
//Dialog1.h
#include "Dialog2.h"
...
//Dialog2.h
#include "Dialog1.h"
#include "Dialog3.h"
#include "XXXResourceFile.h"
//Dialog3.h
#include "Dialog1.h"
现在在当前设计中,我在所有这些标题中添加了#pragma once
。我收到错误 lnk 2005(表示 XXXResourceFile 中的数组已在 Dialog3.obj 中定义,无法双击错误,因为它不在标头或源文件上,而是在 obj 上)。
我的问题是:
-
你能评论一下这个文件的当前设计和理想设计吗?需要更正的内容,缺少的内容等...
我认为我还没有完全理解
#pragma once
的用法。据我所知(也基于我的共同开发人员所说的),它仅包含在头文件中。 cpp 文件呢?
另外,由于我的问题是包含 XXXResourceFile.h,#pragma once
的正确用法应该在 此标头 上吗?还是将包含此标头的文件?这一点是我真正感到困惑的部分。
【问题讨论】:
发布的代码不会导致生成任何目标代码。不足以说明您的问题。 【参考方案1】:这里有头文件循环依赖:
//Dialog1.h
#include "Dialog2.h"
...
//Dialog2.h
#include "Dialog1.h"
#include "Dialog3.h"
#include "XXXResourceFile.h"
//Dialog3.h
#include "Dialog1.h"
Dialog1.h 包含包含 Dialog1.h 的 Dialog2.h。
Dialog1.h 包含 Dialog2.h,其中包含 Dialog3.h,其中包含 Dialog1.h。
您可以使用前向声明和指针类型来打破这一点。
// Dialog1.h
class Dialog2;
class Dialog1
Dialog2* ptrDialog2;
;
// Dialog1.cpp
#include "Dialog2.h"
// Dialog2.h
class Dialog1;
class Dialog2
Dialog1* ptrDialog1;
;
// Dialog2.cpp
#include "Dialog1.h"
【讨论】:
这是另一个问题的解决方案。以上是关于.obj 中定义的 c++ 多个的主要内容,如果未能解决你的问题,请参考以下文章