为什么需要C ++头文件的包含保护?

实际的

我大致了解它的作用。我不明白的是为什么它不是默认值?在哪些情况下需要多次包含某些头文件?

杰里米·弗里斯纳

这些天不是默认值的原因主要是历史原因-当C语言正式化时,#include已指定它必须完全像用户在#include-line位置复制并粘贴了指定文件的内容一样C ++希望(并希望)与C保持尽可能的兼容,因此C ++继承了C的行为。

至于用例,多次包含相同的头文件可能很有用;我发现它有用的一个实例是在C中模拟模板容器类(因为C不直接支持模板)。我有一个容器实现标头文件,看起来像这样(但更复杂;为便于阅读,这里显示的是简化版本):

// MyContainerImplemention.h
// be sure to #define MYTYPE and MYARRAYSIZE
// before #include-ing this file!

struct ArrayOf##MYTYPE
{
   MYTYPE arrayOfItems[MYARRAYSIZE];
};

inline void Set##MYTYPE##Item(struct ArrayOf##MyType * container, int which, MYTYPE item) 
{
   container[which] = item;
}

[... and so on for various other MYTYPE-specific methods ...]

...然后我的.c文件可以执行以下操作:

#define MYTYPE int
#define MYARRAYSIZE 10
#include "MyContainerImplementation.h"
#undef MYARRAYSIZE
#undef MYTYPE

#define MYTYPE short
#define MYARRAYSIZE 15
#include "MyContainerImplementation.h"
#undef MYARRAYSIZE
#undef MYTYPE

struct ArrayOfint myInts;
struct ArrayOfshort myShorts;

SetintItem(&myInts, 5, 12);
SetshortItem(&myShorts, 3, 2);
[...]

...最终得到针对每种数据类型实现的容器“类”及其关联方法,而不必每次都手动编写容器“类”的新实现。

是的,这非常丑陋-但不像必须手动写出数千行冗余容器代码那样丑陋。(真正的容器实现头文件实现了一个哈希表,长度为几百行)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么C ++需要单独的头文件?

为什么C ++头文件不需要包含实现文件(.cpp)?

为什么在2个.CPP文件中包含此头文件(带有头保护)会导致命名冲突?

为什么某些 C++ 功能测试宏需要包含头文件?

为什么头文件不能互相包含?

在C中包含头文件

C / C ++包含头文件的顺序

VSCode 在 c 中包含头文件

无法在C ++中包含头文件

在Swift中包含C ++头文件

为什么C ++ Windows Store应用程序头文件对cpp文件中的包含感到满意?

C ++:通过轻松添加示例了解头文件和头保护

为 C++ 头文件保护实现 VSCode 片段

什么是“ pch.h”,为什么需要将其包含为第一个头文件?

为什么在包含标准库中的头文件时不需要向编译器传递相应的源文件?

C++:在类主体之外定义但包含在头文件保护中的成员函数的 ODR 冲突(如 YouCompleteMe 插件中所示)

在C ++中的头文件中应该包含什么内容?

在C ++代码中包含头文件的更好方法是什么?

为什么我们需要在C ++头文件中使用“ #if defined Identifier”?

为什么需要在Objective-C的头文件中使用“外部静态”来定义常量?

C:我们为什么要包含声明但未定义的头文件?

为什么/如何在Visual Studio中默认包含某些c ++头文件?

如果我们还需要包含标准库头文件,为什么还要指定命名空间?

为什么我们需要构建一个boost库,仅仅包含头文件是不够的,因为boost是模板

为什么可执行二进制文件包含包含的头文件的路径?

pycparser如何读取C代码文件中包含的头文件?

头文件中的“ ...”参数是否需要包含stdarg.h?

使用VC ++包含头文件需要其他步骤吗?

如何在另一个头文件中包含c头文件?