gpt4 book ai didi

c - 预处理器如何知道将 HEADER_H 翻译成 header.h?

转载 作者:太空宇宙 更新时间:2023-11-04 05:37:56 25 4
gpt4 key购买 nike

根据 this question ,似乎您可以灵活地编写它——

#ifndef _HEADER_H

或者:

#ifndef __HEADER___H__

等这不是一成不变的。

但我不明白为什么我们一开始就使用下划线。为什么我不能只写:

#ifndef header.h

这有什么问题?为什么我们到处都加下划线并把所有东西都大写?预处理器对下划线做了什么?

最佳答案

header.h 不是有效的标识符。宏名称中不能有句点。

也就是说,您为包含防护宏选择的名称完全是任意的。毕竟,这只是另一个变量。在文件之后命名它们纯粹是惯例(为了避免冲突也是合理的)。

我鼓励你大声说出头结构,看看预处理器做了什么。

#ifndef MY_HEADER_H    /* If the macro MY_HEADER_H is not defined (yet)... */
#define MY_HEADER_H /* ... then define it now ... */

... /* ... and deal with all this stuff ... */

#endif /* ... otherwise, skip all over it and go here. */

如果将 MY_HEADER_H 替换为 I_REALLY_LIKE_BANANAS 或其他任何内容,您会发现此机制同样有效。唯一的要求是它是一个有效的宏标识符,并且不与任何其他包含保护的名称冲突。

在上面的例子中,宏定义为空。这很好,但这不是唯一的选择。第二行同样可以阅读

#define MY_HEADER_H 1

然后将宏定义为 1。有些人这样做,但它并没有真正添加任何东西,而且值 1 是相当随意的。我一般不这样做。唯一的好处是,如果你把它定义为1,除了#ifdef之外,你还可以使用#if

最后一点警告:以下划线开头或包含两个或多个连续下划线字符的标识符保留用于实现,不应在用户代码中使用。因此,_MY_HEADER_H__MY_HEADER__H__ 都是不幸的选择。

如果你说预处理器找到正确头文件的逻辑

#include <myheader.h>

完全无关。在这里,myheader.h 命名一个文件,预处理器将在多个目录中搜索它(通常可以通过 -I 命令行选项配置)。只有它找到并打开文件后,它才会继续解析它,因此,它最终会找到包含防护,如果它之前已经解析过文件,它将导致它基本上跳过文件(并且 include guard 宏因此已经定义,所以第一次检查的计算结果为 false)。

关于c - 预处理器如何知道将 HEADER_H 翻译成 header.h?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27930221/

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