名字_headerfile_h是什么意思
What does the name _headerfile_h mean
我一直在读 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 使用,以防止 header 被包含两次时出现问题。
请注意,通常情况下,您不应创建以下划线开头的函数、变量、标记或宏名称。 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 问题和外部链接。
指令 #ifndef
检查 "argument" 是否定义为宏。如果它是未定义的(ifndef
中的n
代表"not"),那么直到匹配的#endif
的下一个块被传递由预处理器开启。
如果定义了宏,那么预处理器将跳过该块并且不会将其传递给编译器。
所以 #ifndef _headerfile_h
所做的是检查符号 _headerfile_h
是否被定义为宏。
从宏名称来看,这似乎是 header include guard.
的一部分
我一直在读 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 使用,以防止 header 被包含两次时出现问题。
请注意,通常情况下,您不应创建以下划线开头的函数、变量、标记或宏名称。 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 问题和外部链接。
指令 #ifndef
检查 "argument" 是否定义为宏。如果它是未定义的(ifndef
中的n
代表"not"),那么直到匹配的#endif
的下一个块被传递由预处理器开启。
如果定义了宏,那么预处理器将跳过该块并且不会将其传递给编译器。
所以 #ifndef _headerfile_h
所做的是检查符号 _headerfile_h
是否被定义为宏。
从宏名称来看,这似乎是 header include guard.
的一部分