预编译的头文件,重新包含文件和 Intellisense

Posted

技术标签:

【中文标题】预编译的头文件,重新包含文件和 Intellisense【英文标题】:Precompiled headers, re-including files and Intellisense 【发布时间】:2013-04-12 16:33:17 【问题描述】:

我有一个预编译的头文件,其中包含各种 3rd 方库的包含,例如:

#ifndef PRECOMPILED_H
#define PRECOMPILED_H

#include "booststuff.h"
#include "luastuff.h"

#endif

booststuff.hluastuff.h 是我项目中的头文件,它们只包含各种 boost / lua 相关的东西并设置了一些 typedefs / usings / 命名空间别名.

我在 Visual Studio (2012) 中以通常的方式设置预编译头文件,并使用强制包含选项将其包含在每个 cpp 文件中。

在 cpp 文件中,我也非常小心地使用了 #include "booststuff.h"(我有时会禁用预编译的头文件来测试它)。但是,我最近一直在想这是否是一个好主意。所以:

如果我再次包含一个已经包含在预编译头文件中的文件,是否会发生任何不好的事情(我不明白为什么会这样,但我已经看到有关头文件必须“以相同的顺序包含”的情况”,并没有真正理解他们在说什么)?

它是否会影响 Intellisense(对于一个相当小的项目来说速度非常慢)?我很乐意放弃一些可移植性以获得更好的 Intellisense,因为我目前不想切换平台。

【问题讨论】:

“有什么不好的事情发生吗...” 如果这些标题写得正确,没有。很安全。 【参考方案1】:

如果每个包含文件中都有#pragma once,编译器将在第二次和后续尝试包含该文件时完全跳过读取该文件。它没有明确说明,但我假设预编译的标头也跟踪此信息。

【讨论】:

我可以通过经验确认预编译的头文件确实会跟踪此信息,因此如果以后重新包含相同的头文件将被忽略。 我一次使用标题保护而不是编译指示。这同样适用于 Intellisense 编译器吗? @user673679,Intellisense 必须解析足够多的文件才能意识到由于包含保护,它不会被使用。这对我来说听起来并不快。

以上是关于预编译的头文件,重新包含文件和 Intellisense的主要内容,如果未能解决你的问题,请参考以下文章

禁用在 clang 前端查找预编译的头文件

使用预编译头提高编译速度

VS 总是寻找预编译的头文件

理解问题:预编译的标头和包含用法

GCC 和预编译头文件

浅谈VC++中预编译的头文件放那里的问题分析