dar*_*rda 4 mfc templates inline linker-errors visual-c++
有关MFC项目如何处理的特殊内容吗?
这是场景.我喜欢在h文件中定义类成员函数,而不是在两个文件之间拆分类.
在Visual Studio中,我可以创建一个空的Win32项目,并执行以下操作:
main.cpp中:
#include "doubleDef.h"
int main()
{
doubleDef t;
t.func();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
doubleDef.h:
#pragma once
class doubleDef
{
public:
int func();
};
int doubleDef::func()
{
return 4;
}
Run Code Online (Sandbox Code Playgroud)
这构建得很好.
如果我doubleDef.h进入一个MFC对话框项目,并添加#include "doubleDef.h"到h主对话框的文件,我得到LNK2005,说func已经定义,使它看起来好像#pragma once被忽略了.
如果我改为包含doubleDef.h在主对话框的cpp文件中,一切都很好.但在空的Win32中我可以doubleDef.h通过这样做"多次" 包含:
Header.h
#pragma once
#include "doubleDef.h"
Run Code Online (Sandbox Code Playgroud)
那么header1.h
#pragma once
#include "doubleDef.h"
Run Code Online (Sandbox Code Playgroud)
main.cpp中:
#include "Header.h"
#include "Header1.h"
int main()
{
doubleDef t;
t.func();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
也就是说,它似乎#pragma once按预期工作(防止多个定义doubleDef::func()).
如果我变成doubleDef模板类,那么函数定义必须在h文件中.同样,我可以func inline通过添加关键字或隐式地通过在类中的声明旁边定义它(如在int func() {return 4;})中,然后再次定义必须在h文件中.
根据文档,编译器视为inline或多或少是可选的,所以看起来如果我只想保留h文件中的所有内容,我可以只做一切inline.
是什么赋予了?
这#pragma once意味着每个源文件只包含一次文件.如果您有许多源文件,包括它,您仍然会在每个源文件中获得一个副本.
通过声明一个函数inline,您告诉编译器可以拥有多个副本 - 只要这些副本完全相同.
通常的工作方式是在头文件中使用声明,在另一个源文件中使用定义(实现).
PS MFC与您的问题无关.