gpt4 book ai didi

gcc - 为什么 gcc 有一个 -include 选项?

转载 作者:行者123 更新时间:2023-12-04 02:08:27 25 4
gpt4 key购买 nike

我看到 gcc 有一个 -include 文件选项,它的行为(有点)就像文件的第一行

#include "file"

这个选项有什么好的用途?

最佳答案

-include 的一种实际用途选项位于 Linux 内核构建系统中。

在构建 Linux 内核时,您可以运行一个巨大的配置选项菜单来自定义构建的内核。例如,对于 Linux 3.0 内核,这里是关于是否要在 x86 架构上支持多个 CPU 内核的配置选项:

config SMP
bool "Symmetric multi-processing support"
---help---
This enables support for systems with more than one CPU. If you have
a system with only one CPU, like most personal computers, say N. If
you have a system with more than one CPU, say Y.
[...]

在源代码中,此选项显示为预处理器符号, CONFIG_SMP .内核和驱动程序内的源代码可以做一个 #ifdef CONFIG_SMP当多个处理器需要不同的代码时。 (它也可以用在 Makefile 中,使用不同的语法,选择是否编译 .c 文件或子目录。)

这些预处理器符号是如何定义的?它们不是在编译器命令行上定义的,因为它会非常长(在典型的分发内核上实际上有数千个这样的符号;我为在这台机器上运行的内核计算了超过 4000 个)。相反,所有这些选项都会自动生成一个神奇的头文件。这个头文件然后通过 -include include/generated/autoconf.h 自动包含在所有编译文件中。选项。

CONFIG_预处理器符号应该在所有内核源代码文件的任何地方都可用,使用 -include (在文件的第一行之前隐式包含它)是一件好事。没有它,您将必须执行以下操作之一:
  • 在数千个内核源代码文件中的每一个中,明确将其包含为第一个包含文件,并希望没有人忘记包含它或在包含之前添加一些内容。
  • 明确地将它包含在一个常用的标题中(比如 kernel.h ),并且希望没有依赖于 CONFIG_符号出现在该标题的第一个直接或间接包含之前。

  • 这些选项中的任何一个都明显不如 -include .
    -include还有一个用途在 Linux 内核上,但它更深奥。部分内核(尤其是引导代码的早期部分)必须在实模式下运行。内核的这些部分不是像过去那样完全用汇编编写,而是使用了一种 hack,其中指示汇编程序发出 32 位实模式代码 ( .code16gcc)。这必须作为源代码中的第一件事来完成,在其他任何事情之前,这使得它与 -include 非常匹配。 (这次包含的标题只有一个 asm(".code16gcc"); 语句)。

    关于gcc - 为什么 gcc 有一个 -include 选项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6089310/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com