_headerfile_h 这个名字是啥意思
Posted
技术标签:
【中文标题】_headerfile_h 这个名字是啥意思【英文标题】:What does the name _headerfile_h mean_headerfile_h 这个名字是什么意思 【发布时间】:2019-07-08 05:46:01 【问题描述】:我一直在阅读 Zed Shaw 的“Learn C The Hard Way”。在第 20 章中,作者创建了一个头文件,例如headerfile.h
并包含该行
#ifndef _headerfile_h
。我了解#ifndef
指令,但不了解_headerfile_h
。请解释这个_headerfile_h
或提及任何资源来寻找它。
#ifndef _headerfile_h
#define _headerfile_h
…other material…
#endif /* _headerfile_h */
【问题讨论】:
它被称为“header guard”以防止它被编译两次。在#ifndef ... #endif
块内应该有#define _headerfile_h
【参考方案1】:
它只是一个唯一的名称,仅由该标头使用,以防止标头被包含两次时出现问题。
请注意,一般情况下,您不应创建以下划线开头的函数、变量、标记或宏名称。 C11 §7.1.3 Reserved identifiers 的一部分说:
以下划线和大写字母或另一个下划线开头的所有标识符始终保留以供任何使用。 以下划线开头的所有标识符始终保留用作普通和标记名称空间中具有文件范围的标识符。另见:
What does double underscore (__const
) mean in C?
How do I use extern
to share variables between source files?
Should I use #include
in headers?
Why doesn't the compiler generate a header guard automatically?
What is a good reference documenting patterns of use of ".h
" files in C?
When to use include guards in C
可能还有其他一些人。其中一些问题与其他资源有进一步的链接——SO 问题和外部链接。
【讨论】:
【参考方案2】:指令#ifndef
检查“参数”是否定义为宏。如果它未定义(ifndef
中的n
代表“非”),那么匹配#endif
的下一个块将由预处理器传递。
如果定义了宏,则跳过该块,预处理器不会将其传递给编译器。
所以#ifndef _headerfile_h
所做的是检查符号_headerfile_h
是否定义为宏。
从宏名称看来,这是标题 include guard 的一部分。
【讨论】:
以上是关于_headerfile_h 这个名字是啥意思的主要内容,如果未能解决你的问题,请参考以下文章
ABAP module中,后面跟的名字是啥,例如:MODULE STATUS_0100.STATUS_0100是啥东西?