【问题标题】:How do I make header files?如何制作头文件?
【发布时间】:2021-03-13 22:34:15
【问题描述】:

在我的课程中,他们使用 Code::Blocks 自动生成头文件。但是,我认为没有必要为此专门下载 Code::Blocks,因此我正在寻找一种方法来制作自己的头文件。

因此,我开始在网上搜索以了解具体如何执行此操作。 我检查了How to create my own header file in c++? [closed]cplusplus.com

但是,前者使用#ifndef YOUR_NAME_INCLUDE#define YOUR_NAME_INCLUDE,而后者使用#ifndef __X_H_INCLUDED__#define __X_H_INCLUDED__#ifndef#define 周围有两个下划线。我应该如何格式化我的标题保护?真的很重要吗?

例如,如果我有一个文件foo.h,它看起来像这样:

#ifndef ???
#define ???

int sum(int a, int b) {
    return a + b;
}

#endif

我应该输入SUM_INCLUDEDFOO_INCLUDEDFOO_H 而不是??? 还是其他什么?

其次,制作头文件真的像在末尾添加.h.hpp 一样简单吗?

【问题讨论】:

  • 这是一个很好的问题,但我不确定它是否适合 StackOverflow 模型。无论如何,是的,头文件只是另一个文件中#included 的任何文件,因此它可能是.h.hpp.hxx.h++.hh、@ .helloworld 或任何你喜欢的。我个人使用.hpp(我不喜欢.h,因为.hpp 向我的编辑器提示该文件是用于C++ 而不是C)。然后,对于标题保护(#ifndef + #define 部分),这就是您想做的任何事情。我个人会推荐FOO_HFOO_INCLUDED
  • 你在这里写什么并不重要,只要每个标题都有一个唯一的字符串。虽然标准说包含__ 的名称是保留的,所以你不应该使用它。您还缺少文件末尾的#endif
  • 天哪,我一整天都看到的第一个简单的英语解释-我是五个答案!谢谢@贾斯汀
  • @HolyBlackCat 哎呀。让我解决这个问题。
  • 除了上面讨论的“标题保护”之外,“我如何编写标题?”方法是您通常编写代码,直到您的源文件变得大到可以舒适地滚动浏览。然后您寻找类似/相关的函数以移动到单独的源文件以减小当前文件的大小。要在当前文件中包含您移回的函数,您需要创建一个头文件,该头文件通常包含每个移动函数的函数原型,以及您需要公开的任何常量或结构。将该信息包装在 header-guards 中,您就有了移动函数的标题。

标签: c++


【解决方案1】:
 #ifndef FOO
 #define FOO

 struct foo {};

 #endif

上面的规范示例确保内容(在#ifndef FOO#define FOO 之间)只编译一次,允许我们在多个编译单元中包含这个文件(比如foo.h),而不会导致struct foo 被多次定义.

除此之外,包含文件真的没有任何“魔法”。实际上,扩展甚至无关紧要。它可以是foo.hfoo.hh 或只是foo(如标准库头文件vectoriostream)。

最终,如何构建包含守卫是个人喜好。有些人使用__FOO__(注意这与保留标识符的C++标准相冲突)或FOO_H_INCLUDED(符合标准),而其他人可能会选择不同的模式。

虽然它不是严格标准的 C++,但我的团队使用 #pragma once 并放弃了 ifndef/define/endif 代码。我们使用的所有编译器 (gcc/msvc/clang) 都支持它,并且您没有诸如 foo.h 文件差异太大导致一个(或另一个)定义被排除的缺点。

同样的文件看起来像这样

#pragma once
struct foo {};

【讨论】:

  • “归根结底,如何构建包含守卫是个人喜好。”这是一种误导,因为 C++ 标准保留了一组(大)标识符供实现使用,并且任何使用保留标识符的代码都有未定义的行为。 “有些人使用__FOO__,其他人可能会选择不同的模式。”任何这样做的人都会引入未定义的行为,因为以下划线开头的所有标识符后跟第二个下划线或大写字母都是保留的。
  • 是的,经过编辑以包含该细节,尽管许多编辑默认遵循这种不合规的模式
猜你喜欢
  • 2013-11-26
  • 2014-10-28
  • 1970-01-01
  • 2020-06-21
  • 1970-01-01
  • 1970-01-01
  • 2017-06-09
  • 2011-08-19
  • 1970-01-01
相关资源
最近更新 更多