如何使智能感知将当前源文件视为独立的翻译单元

Posted

技术标签:

【中文标题】如何使智能感知将当前源文件视为独立的翻译单元【英文标题】:How to make intellisense treat the current source file as a standalone translation unit 【发布时间】:2019-09-02 00:17:41 【问题描述】:

在重构我们的项目源以供将来在其他项目中使用时,我们遇到了一个问题:识别真正依赖于什么变得越来越困难,因为 Intellisense 神奇地修复了幕后的一切。

示例问题:

"c.c" 源文件#includes "a.h" 然后"b.h"

所以"b.h" 应该能够在没有任何#include 的情况下使用所有"a.h",因为它是"c.c" 翻译单元的一部分

在编辑"b.h" Intellisense 时“正确”显示来自"a.h" 的所有定义,这太棒了

但是我们需要一种方法来证明"b.h" 顶部缺少#include "a.h" 以供将来重用...有什么方法可以让Intellisense 将"b.h" 视为独立的翻译单元?

编辑:将主源的名称更改为"c.c" 以进行澄清,即使我们的代码中有循环包含,这也不是我们需要修复的实际问题

【问题讨论】:

【参考方案1】:

为了测试,您可以创建一个名为 test_b_h.c 的单独翻译单元,它只有

#include <b.h>

由于它不会生成任何目标代码,因此不会影响生成的可执行文件的大小。

【讨论】:

这么简单的解决方案,我从来没有想过.. 我刚刚花了几个小时研究 Visual Studio IDE,但我可以在几分钟内使用模板项目和 Python 脚本来做到这一点......跨度> @Leonel 有时解决方案太明显了。【参考方案2】:

我不确定你在这里想要一个单独的翻译单元...#include 非常不神奇(它只是连接文件),单独的翻译单元只是编译成单独的目标文件(“b.h”不太可能本身就是一个明智的程序,正如惯常的那样,标头不包含在目标代码中分配存储的任何内容)。

我认为您正在寻找的是包含保护;尝试将所有“b.h”包装在如下内容中:

#ifndef HAVE_B_H
# define HAVE_B_H

/* contents of "b.h" here */

#endif /* HAVE_B_H */

这允许您直接从“a.h”(以及“a.c”)的顶部包含它,确保它在任何地方都可见并且不会被多次包含。 实际上,这通常是一种很好的做法。

【讨论】:

"b.h" 本身确实有合理的接口,并为不同的平台分配资源,这反过来又为#include 来自其他标头的更通用代码,如"a.h" 这就是我们重构的原因,以便能够重用接口并使它们更加跨平台友好。我们已经在每个标题中都有后卫。在示例中"a.h" 不需要包含"b.h",它是"b.h" 应作为证据包含"a.h"

以上是关于如何使智能感知将当前源文件视为独立的翻译单元的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Visual Studio 2012 数据库项目下的智能感知中获取表名?

如何使 ld 将 Multiply 定义的结构/类视为错误?

Flutter VSCode 智能感知不适用于单文件包

如何在 vscode 中使用自己的 javascript 文件获取智能感知

如何使 emf 文件 dpi 感知

如何让 VS Code 智能感知在多个 node_modules 文件夹中搜索打字稿