gpt4 book ai didi

templates - MFC 项目导致 "multiple definition"链接器错误?

转载 作者:行者123 更新时间:2023-12-05 00:22:43 24 4
gpt4 key购买 nike

MFC 项目处理包含的方式有什么特别之处吗?

这是场景。我喜欢在 h 中定义我的类成员函数文件,而不是在两个文件之间拆分一个类。

在 Visual Studio 中,我可以创建一个空的 Win32 项目并执行如下操作:

main.cpp:

#include "doubleDef.h"

int main()
{
doubleDef t;
t.func();
return 0;
}

doubleDef.h:
#pragma once

class doubleDef
{
public:
int func();
};

int doubleDef::func()
{
return 4;
}

这构建得很好。

如果我拿 doubleDef.h到 MFC 对话框项目中,并添加 #include "doubleDef.h"h主对话框的文件,我得到LNK2005,说 func已经定义,看起来好像 #pragma once正在被忽视。

如果我改为包含 doubleDef.h在主对话框的 cpp文件,一切正常。但是在空的 Win32 中我可以包含 doubleDef.h通过这样做“多次”:

Header.h
#pragma once
#include "doubleDef.h"

Header1.h
#pragma once
#include "doubleDef.h"

main.cpp:
#include "Header.h"
#include "Header1.h"

int main()
{
doubleDef t;
t.func();
return 0;
}

即出现 #pragma once按预期工作(防止 doubleDef::func() 的多重定义)。

如果我转 doubleDef成模板类,那么函数定义必须在 h文件。同样,我可以制作 func inline ,通过添加关键字或通过在类中的声明旁边隐式定义它(如在 int func() {return 4;} 中),然后再次定义必须在 h 中文件。

根据 documentation ,编译器处理 inline或多或少是可选的,所以似乎我只想将所有内容保留在 h 中文件,我可以制作一切 inline .

是什么赋予了?

最佳答案

#pragma once意味着每个源文件只包含一次该文件。如果你有很多包含它的源文件,你仍然会在每个源文件中得到一个副本。

通过声明一个函数 inline ,你告诉编译器可以有多个副本 - 只要这些副本是相同的。

通常的工作方式是在头文件中有声明,在另一个源文件中有定义(实现)。

附言MFC 与您的问题无关。

关于templates - MFC 项目导致 "multiple definition"链接器错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29496913/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com