相关疑难解决方法(0)

我可以编写没有标题的C++代码(重复的函数声明)吗?

有没有办法不必编写两次函数声明(头文件),并且在编译时仍然保持相同的可伸缩性,调试的清晰度和在C++中编程时的设计灵活性?

c++ header header-files

56
推荐指数
8
解决办法
4万
查看次数

关于仅使用标头的c ++库的使用量化指标(基准)

我试图用SO找到答案.有许多问题列出了在c ++中构建一个只有头文件库的各种优缺点,但是我无法找到一个以可量化的术语来构建这样的库.

因此,在可量化的术语中,使用传统上分离的c ++标头和实现文件与仅标头之间有什么不同?

为简单起见,我假设不使用模板(因为它们只需要标题).

详细说明,我列出了我从文章中看到的优点和缺点.显然,有些不容易量化(例如易用性),因此无法用于量化比较.我会用可量化的方式标记那些我期望可量化的指标.

仅限标题的优点

  1. 由于您不需要在构建系统中指定链接器选项,因此更容易包含.
  2. 您始终使用与代码的其余部分相同的编译器(选项)编译所有库代码,因为库的函数在代码中内联.
  3. 它可能要快得多.(定量的)
  4. 可以为编译器/链接器提供更好的优化机会(如果可能,可以解释/量化)
  5. 如果你仍然使用模板是必需的.

仅限标题的缺点

  1. 它使代码膨胀.(可量化的)(这会如何影响执行时间和内存占用)
  2. 编译时间更长.(定量的)
  3. 失去接口和实现的分离.
  4. 有时会导致难以解决的循环依赖关系.
  5. 防止共享库/ DLL的二进制兼容性.
  6. 它可能会加剧那些喜欢使用C++的传统方式的同事.

您可以从较大的开源项目(比较类似大小的代码库)中使用的任何示例都非常感激.或者,如果您知道可以在仅标题版本和分离版本之间切换的项目(使用包含两者的第三个文件),那将是理想的.轶事数字也很有用,因为它们给了我一个可以获得一些洞察力的球场.

利弊来源:

提前致谢...

更新:

对于可能稍后阅读并且有兴趣获得关于链接和编译的一些背景信息的任何人,我发现这些资源很有用:

更新:(回应下面的评论)

仅仅因为答案可能不同,并不意味着测量是无用的.你必须开始测量一些点.您拥有的测量值越多,图像就越清晰.我在这个问题上要求的不是整个故事,而是对图片的一瞥.当然,如果他们想要不道德地宣传他们的偏见,任何人都可以使用数字来扭曲争论.但是,如果有人对两个选项之间的差异感到好奇并发布这些结果,我认为这些信息很有用.

没有人对这个话题感到好奇,足以衡量它吗?

我喜欢枪战项目.我们可以从删除大部分变量开始.只在一个版本的linux上使用一个版本的gcc.仅对所有基准测试使用相同的硬件.不要使用多个线程进行编译.

然后,我们可以测量:

  • 可执行大小
  • 运行
  • 内存占用
  • 编译时间(对于整个项目和更改一个文件)
  • 链接时间

c++ benchmarking header-only

41
推荐指数
2
解决办法
2949
查看次数

MFC项目导致"多重定义"链接器错误?

有关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)

mfc templates inline linker-errors visual-c++

4
推荐指数
1
解决办法
184
查看次数