【问题标题】:Why do Eclipse-generated header files start with #ifndef and #define? [duplicate]为什么 Eclipse 生成的头文件以#ifndef 和#define 开头? [复制]
【发布时间】:2016-09-15 11:23:14
【问题描述】:

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

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

//Code, definitions etc....

#endif

我知道它正在定义一个变量来告诉某些文件已定义,我不知道为什么? PHP 中的这种东西与#INCLUDE_ONCE 是一样的吗?我试图在这里和谷歌上搜索这个,但我不太确定我想要的命名是什么,我发现的所有东西都解释了它是什么,它是如何工作的等等......

编辑

由于这类似于 PHP 中的 #include once,那么放置 #include 语句的最佳做法是什么?我假设您希望将它们包含在#define 中,这样如果文件已经包含,它们就不会被包含在内,这也是正确的吗?如果包含的文件在#define 命令之外,它们不会被包含进来吗?

【问题讨论】:

  • 命名法是Include guard
  • 首先要学习的是非常小心地使用“函数”这个词。它有一个特定的含义,预处理器命令离它很远。
  • 许多现代编译器支持#pragma once,它做同样的事情,而且通常更容易阅读。它不是标准的(还),但得到了相当广泛的支持。
  • 如果您愿意,可以在 Eclipse 中更改代码文件模板。窗口 -> 首选项 -> C/C++ -> 代码样式 -> 代码模板

标签: c c-preprocessor


【解决方案1】:

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

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

【讨论】:

  • 感谢您的解释,这就是我的想法,但不确定。这带来了另一个问题,您应该将#include 放在语句中还是外部?我假设您希望文件中的所有内容都包含在语句中,但我可能是错的。
  • 这是标准方法是的:将包含保护放在文件的绝对外部,其他所有内容都在里面。但在实践中,这可能并不重要。如果您在所有头文件中都包含保护,那么两次包含头文件将尝试包含其所有依赖项两次,这将无济于事。虽然这可能效率稍低。
猜你喜欢
  • 2010-12-11
  • 1970-01-01
  • 1970-01-01
  • 2011-06-03
  • 2017-09-06
  • 2013-12-19
  • 2023-04-01
  • 2013-06-30
  • 1970-01-01
相关资源
最近更新 更多