在阅读了这篇漂亮的文章(预编译头的维护和输入)之后,我对这些在现实生活中如何实际工作产生了一些疑问。更具体地说,在以下场景中,我如何知道需要触发预编译头的重建:
预编译头的使用是否应该强制执行某种限制性的编码风格,比如将. cpp文件中包含的头的数量限制为一个,并且永远不要在. cpp文件中定义ing内容?
虽然微软的编译器在预编译标题方面可能做得很好(通过应用一些MS特定的巫毒),因为据我所知,它提供了/Yc
和/Yu
选项,应该可以完成所有的工作,对于GCC来说,这个功能似乎需要在Makefile中进行大量的手工工作和创造性,而我无法找到一个模板来解决使用预编译头的所有缺陷。
例如,如果我有一个构建多个库的项目,为了不在每次更改后重建所有库,我必须在Makefile中使用一些非常可爱的sed
技巧来检测当前库的一个头\include
d是否被修改(或者它\include
是一个修改过的头)。我甚至不敢去想,为了让构建脚本在每次有必要的时候重新构建它们,预构建的头文件实际上意味着什么复杂的事情。
目前的海合会(即GCC)4.7)和以前的版本,只有当你的应用程序有一个通用的头,并且这个头(依次包括应用程序所需的所有系统头和库特定的头)是#时,它才能很好地与预编译的头配合使用包含
-d(作为你的源代码的第一个非注释词汇表)在你的应用程序的每一个源代码中。
所以你应该有一个应用程序。h
并使yourapp
的每个源文件(即每个编译单元)都以开头,在命令行中包含具有相同预处理选项(即
。那-D
或-i
或-U
)的“yourapp.h”youapp。h
头文件通常是#包括许多其他头文件,例如
回想一下,
-H
是一个有用的选项,可以让gcc
告诉您包含了什么。
如果需要的话,您的源文件可能会在
之后包含一些额外的
#包括
。
GCC包含[单个]预编译头后,您当然可以定义宏,
,包括一些非预编译头,使用
#ifdef
等进行条件编译。但预处理不会是“预编译”的!
这可能不符合您的需要或习惯。
一些人(特别是来自Google,特别是Diego Novillo)正在研究PreParsed Header(pph)分支,以改善这种情况,但当前的GCC主干尚未完成这项工作。
关于GCC这种行为的解释是,预处理头本质上是整个GCC堆的持久序列化检查点(通过Ggc和GTY以及
gengtype
与GCC内部的内存管理有关)。只有当gcc
处于初始空状态时,才能加载该检查点堆。一旦gcc
(实际上是cc1
或cc1plus
)知道了什么,它就不能再加载任何预编译的头文件*。h.gch
并将恢复解析文本头file*. h
.
甚至GCC4.9也需要一个预编译头。Diego Novillo等人的预解析头工作已被放弃。
C标准的未来版本(C 14之后)可能会定义一种模块机制。参见例如n4047提案和C 20标准。
(附加附录,2020年夏季)这仍然适用于GCC-10,其中存在多个静态分析仪选项。另请参见Clang静态分析器和本报告草稿。考虑使用FrAMA.C.
gcc 是 GNU 推出的功能强大、性能优越的多平台编译器,是 GNU 的代表作品之一。它能将C、C++语言源程序、汇编语言源程序和目标程序编译、链接成可执行文件,如果没有给出可执行文件的名字,gcc 将生成一个名为 a.out 的文件。 gcc 通过后缀来区分输入文件的类型: 后缀 类型 .c C语言源代码文件 .a 由目标文件构成的档案库文件 .C|.cc|.cxx C++源代码文件 .h 程
Handlebars.compile(template, options) 编译一个模版以立即运行。 const template = Handlebars.compile("{{foo}}"); template({}); 支持多种选项以更改模版的执行方式。 data: 设置为 false 以终止 @data 跟踪。 compat: 设置为 true 以允许递归领域查找。 knownHelpe
前言 预处理 简述 打印出预处理之后的结果 在命令行定义宏 编译(翻译) 简述 语法检查 编译器优化 生成汇编语言文件 汇编 简述 生成目标代码 ELF 文件初次接触 ELF 文件的结构 三种不同类型 ELF 文件比较 ELF 主体:节区 汇编语言文件中的节区表述 链接 简述 可执行文件的段:节区重排 链接背后的故事 用 ld 完成链接过程 C++ 构造与析构:crtbegin.o 和 crten
我正在使用下面的gcc工具链。gcc版本5.4.1 20160919(发布)[ARM/embedded-5-branch修订版240496](适用于ARM嵌入式处理器的GNU工具) 我可以创建。h.gch文件,但无法获取。h.gch在构建. c文件时使用。我使用-H和-Wulult-pch选项来检查原因,但编译器没有给出任何信息。就像。h.gch不存在,总是搜索。h文件。
Mpx 支持 CSS 预编译处理,你可以通过在 style 标签上设置 lang 属性,来指定使用的 CSS 预处理器。Mpx 会根据指定的 CSS 预处理器类型,将其编译为浏览器可识别的 CSS 标准代码。 <!-- 使用 stylus --> <style lang="stylus"> .nav width 100px height 80px color #f90
本文向大家介绍什么是预编译,何时需要预编译:相关面试题,主要包含被问及什么是预编译,何时需要预编译:时的应答技巧和注意事项,需要的朋友参考一下 1、总是使用不经常改动的大型代码体。 2、程序由多个模块组成,所有模块都使用一组标准的包含文件和相同的编译选项。在这种情况下,可以将所有包含文件预编译为一个预编译头。