C++编译器宏"Use Precompiled Headers"的状态

C++ Compiler Macro for Status of "Use Precompiled Headers"

本文关键字:Headers 状态 Precompiled Use 编译器 C++      更新时间:2023-10-16

它有一个预定义的c++编译器宏,我可以用它来告诉,文件是否编译与"使用预编译头","创建预编译头","不使用预编译头"?

查看@IronMensan的回答来了解这个宏的用途!

我不认为有什么,虽然我当然理解对一个的渴望。每当我必须在一个不支持PCH的系统上构建我的跨平台库时,它就会花费很长时间,因为很多文件都比它们真正需要的要多,所以最好把它修剪掉。不幸的是,由于Visual Studio处理PCH的方式,我不能。也就是说,包含PCH的必须是文件的第一个非注释行。从你提问的方式来看,我怀疑你也在使用Visual Studio。

我不确定这是否适合你,但你可以尝试这样做:

#include MY_PCH_FILE

和使用/DMY_PCH_FILE = " myfile.h "

来控制第一个包含文件是什么。在此之后,您可以完全控制包含的内容,并且大多数现代编译器中的适当头保护以及检测头保护的优化可以减少构建时间。您可以在项目的构建设置中更改单个文件的宏定义,其方式类似于更改每个文件的PCH设置。

虽然我必须承认我不确定你在做什么,我怀疑这真的是一个XY问题

Visual Studio/MSC不提供预定义的宏来携带/Y[-cdu]编译器开关的设置,以便从源代码中进行检查。

然而,有一个解决方案,你正试图解决的问题,即控制源文件的第一个非注释行是否应该是#include "<my pch.h>": MSC提供/FI(名称强制包含文件)编译器开关。

该选项的效果与在命令行[…]

中指定的每个源文件的第一行使用#include指令中的双引号指定文件相同。

此编译器开关可以在编译器的命令行中指定,也可以通过IDE的GUI (Project -> Properties: C/c++ -> Advanced: Forced Include File)在每个项目的基础上指定。

使用/Y[-cdu]/FI编译开关的组合,您可以从源代码外部控制使用并满足使用预编译头文件的要求。

在这种情况下,我认为您可以手动创建自己的宏。当你像这样使用预编译时,可以定义USE_PRECOMPILEDHDRFORCED_INCLUDEHDR

#if USE_PRECOMPILEDHDR
    #ifndef FORCED_INCLUDEHDR
        #include "stdafx.h"
    #endif
#else 
    //..manualy include all your headers
#endif

此功能不太可能存在。预编译头文件的全部意义在于,头文件将使用与实际编译时完全相同的编译器选项进行编译。如果编译器为您的代码提供了一种区分方法,那么您可以根据编译器是预编译还是实际编译,使代码表现不同(在预处理器级别)。

如果您希望根据是否启用预编译头文件来包含头文件,则应该使用include Guard。