我大致了解它的作用。我不明白的是为什么它不是默认值?在哪些情况下需要多次包含某些头文件?
这些天不是默认值的原因主要是历史原因-当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] 删除。
我来说两句