c - 为什么 Eclipse 生成的头文件以#ifndef 和#define 开头?

标签 c c-preprocessor

我知道 #define 函数是一个预处理器命令,它基本上是复制和粘贴代码块,因为缺乏更好的解释。我不清楚的是它插入的 Eclipse 头文件的模板:

#ifndef <FileName>_H
#define <FileName>_H

//Code, definitions etc....

#endif

我知道它正在定义一个变量来告诉某些文件已定义,但我不知道为什么? PHP 中的这种情况与#INCLUDE_ONCE 相同吗?我试图在这里和谷歌上搜索这个,但我不太确定我想要的术语是什么,我找到的所有内容都解释了它是什么,它是如何工作的等等......

编辑

由于这类似于 PHP 中的 #include 一次,因此放置 #include 语句的最佳实践是什么?我假设您希望它们位于 #define 内,因此如果文件已包含,则它们不会被包含在内,这也正确吗?如果包含的文件位于 #define 命令之外,那么无论如何它们都不会被包含吗?

最佳答案

是的,这与 PHP #INCLUDE_ONCE 非常相似。这个想法是头文件包含其他模块中使用的函数和变量的声明。这些模块必须 #include 头文件才能访问这些函数和变量。但是,如果源文件 #include 是一个 header ,然后 #include 是另一个 header ,而该 header 也是 #include 的,那么您将获得这些声明的两个副本,这会导致各种问题。

这种常见技术可以防止重复包含。它确保#include header 的任何代码单元在第一次请求时都会获得其副本,但不会再次请求。

关于c - 为什么 Eclipse 生成的头文件以#ifndef 和#define 开头?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37308664/

相关文章:

c - 如何解析DW_OP_call_frame_cfa?

c - 重新分配原始数组后,数组元素会发生什么?

char *filenames[1] 或 char *filenames 有什么区别?

c - 用于从头文件中提取和操作 C 函数的搜索工具

在运行时检查宏是否已定义

c++ - 在 C++ 中删除编译源的任何脚本

c++ - 如何在 C++ 预处理器指令中使用 "#"作为字符

C:对可变长度位串的位操作

c - 了解 getpid() 系统调用的 strace

C 在不同的头文件中定义具有相同名称的宏?