【发布时间】:2010-11-19 03:38:44
【问题描述】:
有些人有在头文件中添加头文件导入/包含的习惯。另一方面,在头文件中编写前向声明并在实现文件中编写实际的#include 或#import 行。
这有标准做法吗?哪个更好,为什么?
【问题讨论】:
标签: c++ objective-c c coding-style
有些人有在头文件中添加头文件导入/包含的习惯。另一方面,在头文件中编写前向声明并在实现文件中编写实际的#include 或#import 行。
这有标准做法吗?哪个更好,为什么?
【问题讨论】:
标签: c++ objective-c c coding-style
鉴于 X.h 和 X.c,如果您 #include 来自 X.h 的所有内容,那么 #include <X.h> 的“X”客户端也将包含所有这些标头,即使某些可能仅在 X.c 中需要。
X.h 应该只包含解析 X.h 所需的内容。它应该假设翻译单元不会包含其他标题,以确保重新排序包含不会破坏客户端。 X.c 应包括实施所需的任何额外内容。
这最大限度地减少了重新编译的依赖性。您不希望仅对实现进行更改以影响标头并因此触发客户端重新编译。您应该直接从 X.c 中包含。
【讨论】:
当类具有浅依赖时,需要包含前向引用而不是标头。例如:
啊.h
#include "B.h"
class A {
B* pointer;
};
B.h
#include "A.h"
class B {
A* pointer;
};
会在编译时中断。
啊.h
class B;
class A {
B* pointer;
};
B.h
class A;
class B {
A* pointer;
};
将起作用,因为每个类只需要知道声明中存在另一个类。
【讨论】:
我将导入写入头文件,因此每个实现文件只有一个包含指令。这还具有对模块代码的用户隐藏依赖项的优点。
但是,同样的隐藏也有一个缺点:您的模块的用户可能会导入包含在您的标头中的各种其他标头,而他可能根本不需要这些标头。从这个角度来看,最好在实现文件中包含包含指令,即使这意味着手动解决依赖关系,因为它会导致代码更轻。
我认为没有单一的答案。考虑到我给出的原因,我更喜欢第一种方法,我认为它会导致代码更简洁(尽管更重并且可能有不必要的导入)。
我不记得我在引用谁(因此这个短语并不准确),但我总是记得读到:“程序是为人类阅读而编写的,偶尔是为了让计算机执行”。我并不特别关心我的模块的用户是否不需要几千字节的代码,只要他可以干净、轻松地导入它并通过单个指令使用它。
再一次,我认为这是一个品味问题,除非有什么我没有考虑到的。在这种情况下,我们非常欢迎发表评论!
干杯。
【讨论】: