当前位置: 首页 > 知识库问答 >
问题:

GCC和预编译头

钱承允
2023-03-14

在阅读了这篇漂亮的文章(预编译头的维护和输入)之后,我对这些在现实生活中如何实际工作产生了一些疑问。更具体地说,在以下场景中,我如何知道需要触发预编译头的重建:

  • 我决定在我的一本书中定义一些东西。cpp文件,改变预处理器解释已包含在预编译头中的某些头的方式

预编译头的使用是否应该强制执行某种限制性的编码风格,比如将. cpp文件中包含的头的数量限制为一个,并且永远不要在. cpp文件中定义ing内容?

虽然微软的编译器在预编译标题方面可能做得很好(通过应用一些MS特定的巫毒),因为据我所知,它提供了/Yc/Yu选项,应该可以完成所有的工作,对于GCC来说,这个功能似乎需要在Makefile中进行大量的手工工作和创造性,而我无法找到一个模板来解决使用预编译头的所有缺陷。

例如,如果我有一个构建多个库的项目,为了不在每次更改后重建所有库,我必须在Makefile中使用一些非常可爱的sed技巧来检测当前库的一个头\included是否被修改(或者它\include是一个修改过的头)。我甚至不敢去想,为了让构建脚本在每次有必要的时候重新构建它们,预构建的头文件实际上意味着什么复杂的事情。

共有1个答案

蔡宏大
2023-03-14

目前的海合会(即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(实际上是cc1cc1plus)知道了什么,它就不能再加载任何预编译的头文件*。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、程序由多个模块组成,所有模块都使用一组标准的包含文件和相同的编译选项。在这种情况下,可以将所有包含文件预编译为一个预编译头。