.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++ 多个的主要内容,如果未能解决你的问题,请参考以下文章

捕获多个自定义异常? - C++

C++ 中的多个类定义错误,我的头文件有问题吗?

[debug] 解决在C++编写过程中的“找到一个或多个多重定义的符号”

C++找到一个或多个多重定义的符号

C++ 多个定义,即使只给出一个定义

使用 MatLab dll 时出现 C++ 错误:找到一个或多个多重定义符号