有没有一种方法可以在C++中“取消包含”一个文件?

6

我有一个类,只在另一个类的特定部分中使用。它没有在主类的任何其他部分提到。我在文件顶部包含了相应的头文件。

有没有办法在使用完后“取消包含”该头文件?

我的意思是,在您“取消包含”包含该类的头文件后,对该类的引用将无法定义,并且对该类的任何调用在编译时都会引发错误。

伪代码:

// code section where "cubeData" should be visible
#include "CubeData.h"

void mainWidget::createGeoObjects() {
  cube = new cubeData();
  // ...
}

// #uninclude "CubeData.h" - ???
//
// code section where "cubeData" should be invisible
void mainWidget::otherFunction() {
  cube = new cubeData(); // should result in a compile error
  // ...
}


1
你可能想要考虑使用命名空间。 - Kenny Ostrom
你可能能够编写自己的PIMPL包装器。 - EOF
你能展示给我如何做吗? - new QOpenGLWidget
@zixuan:我自作主张,完善了你的代码示例以使问题更加易懂。希望我理解得正确。 - Doc Brown
2个回答

9
在代码文件的中间未包含头文件,而在文件开头已经包含了该头文件,其作用是使第二部分代码不受头文件的影响,好像没有包含头文件一样。
可以通过将代码文件分为两部分来实现。
第一部分包括所需的头文件(以及可能还有其他头文件)。
第二部分不包括该头文件(但再次包含其他头文件,以便了解它们的内容)。
您可能需要将第一部分中需要在第二部分中可见的任何内容放入新的头文件中,并将其包含在两个部分中。
简而言之,创建两个代码文件并将所需的内容包含到它们中。特别是不要包含不需要可见的内容。

@DocBrown感谢您的编辑工作。请不要误解“编辑战”的意思。;-) - Yunnosch
如果您想要恢复您的错别字,请随意撤销我的编辑,我将不会再次删除它们;-) - Doc Brown
嗯,我的语言中有句话:“如果你发现拼写错误,你可以保留它。”我只是提到我自己也在尝试修复一些错别字,而你正忙着做同样的事情。最后,我强制提交了我的最后一次编辑,结果发现与你的完全相同。我只想和你分享我的微笑,并确保你不感到被攻击,甚至不被拒绝。@DocBrown - Yunnosch
我本来也要写一个非常类似的答案,但你比我更快——幸运的是,当你的帖子出现时,我甚至还没有开始写;-) - Doc Brown

7

不。

其中一部分是包含在预处理器中。对于实际的编译器来说,来自被包含文件的代码和来自包含文件的代码看起来是相同的。


3
我很想编辑我的回答,以"Yes."开头。不是为了刁难你,而是为了强调不同的方法。我承认你的回答是"不行",表达了不能这样做,而且我同意预处理器并不起作用。我的回答是关于实现效果的,而你的回答则是按照要求严格执行。实际上,我并没有看到两个答案之间的冲突。我点赞你的回答。 - Yunnosch
我想我严格回答了标题中提出的问题,而你正在解决潜在的问题。 - mrks
两者都有价值。例如,我可能误解了背景目标(尽管现在我已经得到了接受的勾选标记,但这是事后看法)。 - Yunnosch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接