【问题标题】:How to include part of file by C++ preprocessor #include如何通过 C++ 预处理器#include 包含部分文件
【发布时间】:2013-01-22 07:24:40
【问题描述】:

我想参考一些不是由我维护的稳定库代码。其实是一些MFC代码sn-p。

但是,每当我想包含代码 sn-p 时,我必须 #include 整个文件,因此我必须包含其他内容,然后是整个 MFC ... 结果是不可接受的。

目前,我将代码 sn-p 复制/粘贴到我的项目中,但我觉得很丢脸。我可以只通过 C++ 预处理器引用文件的一部分吗?

即使代码与特定的 MFC 版本硬链接,也比在我的项目中复制它们要好。有了这样的硬链接,我就知道它来自 MFC 并节省我检查它们的时间。

有没有超级#include的用法?


我们可以写类似的东西

#include  "foo.h" line [12, 55)

这意味着为 foo.h 包含第 22 到 54 行

【问题讨论】:

  • 是 - 1) 你可以用“#ifdef/#ifndef/#endif”“屏蔽”你不想要的标题部分。当然,这意味着修改标题。 2)或者,您可以将所需的部分剪切/粘贴到新标题中。
  • 如果您创建自己的标头并将 sn-p 复制到其中,每个版本的 MFC 一次,然后使用您的标头,它可能会最干净,IMO。不是特别好,但比破解系统提供的标头更好(这是最后的手段)。
  • 您在谈论包含标题内容,不是吗?还是您应该尝试包含任何类型的实现代码?对于后者:不要这样做,而是构建一个要链接到的对象。
  • 摆弄编译器头文件是一个坏主意,原因有很多。但除此之外,为了由其他人维护而引用头文件似乎不是一个特别好的主意,然后确保您必须手动编辑所述头文件才能使其工作。

标签: c++ include c-preprocessor


【解决方案1】:

有些人所做的是在其标题中写入#ifdef-sections,以允许包含文件仅获取特定部分。我不知道您的 MFC 文件是否有这些文件,但您可以查看它并使用任何现有的文件或编写您自己的文件。

标题通常看起来像这样

#ifdef USE_FANCYPANTS
bool hasFancyPants();
#endif

#ifdef USE_COOLSTUFF
void doCoolStuff();
#endif

然后您的包含文件在包含之前使用#define。

#define USE_FANCYPANTS
#include "header.hpp"

那么你只会得到 hasFancyPants() 而不是 doCoolStuff()

【讨论】:

    【解决方案2】:
    • 您可以使用条件编译来包含/排除您不需要的内容。您必须稍微更改源代码,并修改项目设置。
    • 可以使用 typedef 关键字,这将为 MFC 和非 MFC 定义不同的类型,和/或特定于您的项目设置和旧代码。
    • 您可以将整个内容放在 DLL 或 .LIB 中(包含代码,而不仅仅是声明),并将链接器编译指示放在头文件本身中。

    【讨论】:

      猜你喜欢
      • 2019-07-08
      • 1970-01-01
      • 1970-01-01
      • 2017-03-05
      • 2019-06-22
      • 1970-01-01
      • 2019-07-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多