gpt4 book ai didi

c++ - 头文件在整个程序中只包含一次?

转载 作者:IT老高 更新时间:2023-10-28 12:55:44 28 4
gpt4 key购买 nike

我知道这是一个常见问题,但我仍然无法完全理解它。

在从多个不同的源文件和头文件生成的C或C++程序中,当使用头保护时,每个头文件是否会在整个代码中只包含一次?

之前有人告诉我,一个头文件(带有包含保护)只会在一个翻译单元中包含一次,但在整个代码中会包含多次。这是真的吗?

如果它在整个代码中只包含一次,当一个文件希望包含它并且预处理器检测到它已经被包含时,希望使用它的那个文件如何知道它在之前包含的代码中的下落?

最佳答案

这是过程:

source           header   source header header
\ / \ | / /
\ / \ | / /
PREPROCESSOR PREPROCESSOR
| |
V V
preprocessed code preprocessed code
| |
COMPILER COMPILER
| |
V V
object code object code
\ /
\ /
\ /
LINKER
|
V
executable

预处理

#include 是第一步。它指示预处理器处理指定的文件,并将结果插入到输出中。

如果A包含BC,且B包含CA 的预处理器输出将包含两次 C 的处理文本。

这是一个问题,因为它会导致重复声明。一种补救方法是使用预处理器变量跟踪是否包含源代码(也称为 header 保护)。

#ifndef EXAMPLE_H
#define EXAMPLE_H

// header contents

#endif

第一次,EXAMPLE_H 是未定义的,预处理器将评估 ifndef/endif block 中的内容。第二次,它将跳过该 block 。所以处理后的输出变化,定义只包含一次。

这很常见,以至于一些编译器实现了一个非标准指令,它更短并且不需要选择唯一的预处理器变量:

#pragma once

// header contents

您可以确定您希望 C/C++ 代码的可移植性,以及要使用的 header 保护。

header 守卫将确保每个 header 文件的内容在翻译单元的预处理代码中最多出现一次。

编译

编译器从您预处理的 C/C++ 生成机器代码。

通常,头文件仅包含声明,而不包含实际定义(也称为实现)。编译器为当前缺少定义的任何内容都包含一个符号表。

链接

链接器组合目标文件。它将定义(又名实现)与对符号表的引用进行匹配。

可能是两个目标文件提供了定义,链接器会取一个。如果您将可执行代码放在 header 中,就会发生这种情况。这在 C 中通常不会发生,但在 C++ 中却经常发生,因为模板。

header “代码”,无论是声明还是定义,都包含在所有目标文件中多次,但链接器将所有这些合并在一起,因此它仅在可执行文件中出现一次。(我不包括多次出现的内联函数。)

关于c++ - 头文件在整个程序中只包含一次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30873206/

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