Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C和/或Objective-C中对头文件进行分组_C_Objective C_Header - Fatal编程技术网

在C和/或Objective-C中对头文件进行分组

在C和/或Objective-C中对头文件进行分组,c,objective-c,header,C,Objective C,Header,我有时会使用一个头文件来导入一组相关的头文件,这些头文件描述了模块所有公共组件上的接口。这样做是为了方便。使用该模块的任何人只需导入一个头文件 是否推荐这种做法?如果推荐,该做法是否有名称?我试图给头文件命名,明确表示它们是组导入,并想知道是否有任何约定?所有Cocoa框架都会这样做:例如,AppKit.framework包含一个头文件名“AppKit.h”,这样就可以使用\import包含所有AppKit。它只包含约180个头导入语句的列表 我没有这个模式的名称,但我也在自己的库中使用它(静态

我有时会使用一个头文件来导入一组相关的头文件,这些头文件描述了模块所有公共组件上的接口。这样做是为了方便。使用该模块的任何人只需导入一个头文件


是否推荐这种做法?如果推荐,该做法是否有名称?我试图给头文件命名,明确表示它们是组导入,并想知道是否有任何约定?

所有Cocoa框架都会这样做:例如,AppKit.framework包含一个头文件名“AppKit.h”,这样就可以使用
\import
包含所有AppKit。它只包含约180个头导入语句的列表


我没有这个模式的名称,但我也在自己的库中使用它(静态或框架)。

所有Cocoa框架都会这样做:例如AppKit.framework包含一个标题名“AppKit.h”,这样就可以使用
\import
包含所有AppKit。它只包含约180个头导入语句的列表


我没有这个模式的名称,但我也在自己的库中使用它(静态或框架)。

对于Objective-C,使用#import指令的情况要好一点,但是,在C/C++中,这是一件非常糟糕的事情,因为对这些标题中描述的任何接口的任何更改都将不可避免地触发所有.c/.cpp文件的重建,包括您使用的文件。
如果您在某个时候发现了TDD之类的东西,或者至少只是单元测试,那么您就必须与这种标头引入的潜在的非常复杂的依赖项作斗争。

我个人建议避免使用此类解决方案,除非您知道自己在做什么。

对于Objective-C,使用#import指令的情况要好一点,但是,在C/C++中,这是一件非常糟糕的事情,因为对这些标题中描述的任何接口的任何更改都将不可避免地触发所有.c/.cpp文件的重建,包括您使用的文件。
如果您在某个时候发现了TDD之类的东西,或者至少只是单元测试,那么您就必须与这种标头引入的潜在的非常复杂的依赖项作斗争。

我个人建议避免使用此类解决方案,除非您知道自己在做什么。

这没关系,但有一点需要注意:尽量不要包含您不需要的头文件

如果包含的头更少,那么对头的依赖性就更少,因此模块之间的依赖性也更少,如果头发生更改,则需要重新编译的文件也会更少

对于嵌入式系统,C语言中的一种常见模式是有一个标头(由处理器制造商提供),其中包括定义处理器外围设备寄存器的所有单独标头,每个源文件中都包含该标头。除此之外,源文件只包含它们实际需要的头文件


(在上面,“header”是指扩展名为.h的头文件,“include”是指#include preprocessor指令)。

没关系,但有一点需要注意:尽量不要包含不需要的头文件

如果包含的头更少,那么对头的依赖性就更少,因此模块之间的依赖性也更少,如果头发生更改,则需要重新编译的文件也会更少

对于嵌入式系统,C语言中的一种常见模式是有一个标头(由处理器制造商提供),其中包括定义处理器外围设备寄存器的所有单独标头,每个源文件中都包含该标头。除此之外,源文件只包含它们实际需要的头文件


(在上面,“header”是指扩展名为.h的头文件,“include”是指#include preprocessor指令)。

但是,如果您谈论的是使用类似于SDK/framework的基础设施,“module”的接口不会改变,当然,当库发生变化时,依赖于“库头”的每个编译单元都必须重新编译。你能解释一下这和TDD有什么关系吗?为什么在使用
#import
时情况会更好?首先我要道歉,最初我想的是一堆.c/.h/.cpp或.m以及其中的“接口”,而不是“库”及其接口。其次,提到TDD是因为单元测试实践,我想您会同意,包含依赖项并不能帮助您测试代码。第三,#import指令确保只包含一个标题,而#include必须至少读取每个标题的“include guards”,这基本上会降低构建速度。首先,我想让你知道,你不必道歉,我只是想知道你的意思。其次,我同意通常应该避免依赖性(不仅仅是在TDD中)。第三,gcc和其他编译器(或者更确切地说是预处理器)知道头文件包括保护模式和特殊情况,以避免重新加载文件。
#import
#include
之间的唯一区别在于,在目标C中可以省略愚蠢的include卫士。但是,如果您谈论的是使用类似于SDK/framework的基础设施,“模块”的接口不会改变,当然,当库发生变化时,依赖于“库头”的每个编译单元都必须重新编译。你能解释一下这和TDD有什么关系吗?为什么在使用
#import
时情况会更好?首先我要道歉,最初我想的是一堆.c/.h/.cpp或.m以及其中的“接口”,而不是“库”及其接口。其次,提到TDD是因为单元测试实践,我想您会同意,包含依赖项并不能帮助您测试代码。第三,进口指令