我可以使用预定义的c ++编译器宏来判断文件是否使用“使用预编译标题”编译,“创建预编译标题”,“不使用预编译标题”?
请参阅@IronMensan的答案,以达到这样一个宏的目的!
答案 0 :(得分:2)
我认为没有任何东西,但我当然理解对一个人的渴望。每当我必须在一个不支持PCH的系统上构建我的跨平台库时,它需要永远,因为很多文件都比实际需要的更多,并且很好地修改它。不幸的是我不能因为Visual Studio如何处理PCH。即,包含PCH必须是文件的第一个非注释行。从您提出问题的方式来看,我怀疑您还在使用Visual Studio。
我不确定这是否适合你,但你可以尝试这样的事情:
#include MY_PCH_FILE
并使用 /DMY_PCH_FILE="myfile.h“
在命令行上控制第一个包含文件的内容。在此之后,您可以完全控制所包含的内容,并且在大多数现代编译器中使用正确的标头保护以及优化以检测标头保护可以减少构建时间。您可以在项目的构建设置中更改单个文件的宏定义,其方式与更改每个文件的PCH设置的方式类似。
虽然我必须承认我不确定你要做什么,我怀疑这确实是XY problem
答案 1 :(得分:1)
Visual Studio / MSC不提供预定义的宏,该宏带有/Y[-cdu]
编译器开关的设置,以便从源代码进行检查。
但是,您尝试解决的问题有一个解决方案,即控制源文件的第一个非注释行是否应为#include "<my pch.h>"
:MSC提供/FI (Name Forced Include File)编译器开关。
此选项与在命令行上指定的每个源文件的第一行上的#include指令中使用双引号指定文件具有相同的效果[...]
可以在编译器的命令行上指定此编译器开关,也可以通过IDE的GUI(项目 - &gt;属性:C / C ++ - &gt;高级:强制包含文件)在每个项目的基础上指定。
通过/Y[-cdu]
和/FI
编译器开关的组合,您可以控制使用并满足源代码外部使用预编译头的要求。
答案 2 :(得分:0)
在这种情况下,我认为你可以自己创建宏观。 您可以在使用此类预编译时定义 USE_PRECOMPILEDHDR 和 FORCED_INCLUDEHDR
#if USE_PRECOMPILEDHDR
#ifndef FORCED_INCLUDEHDR
#include "stdafx.h"
#endif
#else
//..manualy include all your headers
#endif
但正如其他说法,除非您为另一个编译器进行更改,否则您没有理由为此使用防护。
答案 3 :(得分:-1)
此功能不太可能存在。预编译头文件的重点在于,头文件将使用与编译为real时完全相同的编译器选项进行编译。如果编译器为代码提供了一种区分方法,那么根据编译器是预编译还是实际编译,您可以使代码的行为不同(在预处理器级别)。
答案 4 :(得分:-3)
如果您希望根据是否启用预编译标头来包含标头文件,则应使用Include Guard代替。