包含所有其他头文件的单个头文件? 从面向对象的角度(主要是C++和目标C),

包含所有其他头文件的单个头文件? 从面向对象的角度(主要是C++和目标C),,c++,objective-c,oop,header-files,C++,Objective C,Oop,Header Files,将项目中使用的所有头文件都包含在一个(.h)中,并简单地将此头文件包含在所有实现文件中,以及(右)使用“头保护”和“pragma once”(或“import”)是否是一种良好的编程实践 这会有什么负面影响?这是一个非常糟糕的想法。这将大大降低编译过程的速度。如果在每个文件或其中的大部分文件中都有多个头文件需要访问,请检查预编译头文件(xCode中的.pch)。这是正确的做法 扩展答案:创建类时,您希望在.h文件中包含尽可能少的头。最好将它们放在.m中,因为它们不会影响包含标头的其他类的编译时间

将项目中使用的所有头文件都包含在一个(.h)中,并简单地将此头文件包含在所有实现文件中,以及(右)使用“头保护”和“pragma once”(或“import”)是否是一种良好的编程实践


这会有什么负面影响?

这是一个非常糟糕的想法。这将大大降低编译过程的速度。如果在每个文件或其中的大部分文件中都有多个头文件需要访问,请检查预编译头文件(xCode中的.pch)。这是正确的做法

扩展答案:创建类时,您希望在.h文件中包含尽可能少的头。最好将它们放在.m中,因为它们不会影响包含标头的其他类的编译时间。当您需要提前知道类型的大小时,只需要在a.h中完整定义类型。但是您总是知道指针的大小,所以向前声明就足够了:

MyObject.h

#import "MyStruct.h"

@class Foo;  //Forward declaration of Foo.

@class MyObject
{
    Foo *foo; //No problem, you know the size. You can import Foo.h in MyObject.m
    MyStruct struct; //Oops, this is not a pointer. You need to import it's definition right here.
}
@end
MyObject.m

#import "MyObject.h"
#import "Foo.h"


这是个相当糟糕的主意。这将大大降低编译过程的速度。如果在每个文件或其中的大部分文件中都有多个头文件需要访问,请检查预编译头文件(xCode中的.pch)。这是正确的做法

扩展答案:创建类时,您希望在.h文件中包含尽可能少的头。最好将它们放在.m中,因为它们不会影响包含标头的其他类的编译时间。当您需要提前知道类型的大小时,只需要在a.h中完整定义类型。但是您总是知道指针的大小,所以向前声明就足够了:

MyObject.h

#import "MyStruct.h"

@class Foo;  //Forward declaration of Foo.

@class MyObject
{
    Foo *foo; //No problem, you know the size. You can import Foo.h in MyObject.m
    MyStruct struct; //Oops, this is not a pointer. You need to import it's definition right here.
}
@end
MyObject.m

#import "MyObject.h"
#import "Foo.h"


'包含所有其他头文件的单个头文件?'。。。这可能不是个好主意!!检查此处:将其限制在不太可能更改的文件中。这与OOP没有多大关系…
这会带来什么负面影响?
编译时间非常长,因为现在任何头文件更改时都需要重建,而不是只重建实际需要头文件的源文件。当您有一个小项目时,这可能不是什么大问题,但当您的代码包含数百个类时,这会使您的编译从几秒钟变为几分钟。“一个包含所有其他头文件的头文件?”。。。这可能不是个好主意!!检查此处:将其限制在不太可能更改的文件中。这与OOP没有多大关系…
这会带来什么负面影响?
编译时间非常长,因为现在任何头文件更改时都需要重建,而不是只重建实际需要头文件的源文件。当您有一个小项目时,这可能不是什么大问题,但是当您的代码包含数百个类时,这会使您的编译从几秒钟变为几分钟。感谢您富有洞察力的回复。为了澄清起见,我在这里()读到“导入行仅在第一次遇到命名文件时被替换为该文件的内容。之后每次都被忽略。”因此,对于不更改的头文件,使用#import这种方法还会增加编译时间吗?它会被忽略,因为内容不会被附加(就像在计划C中使用#include时一样,因此需要使用include防护)。但您仍然在编译过程中添加工作。相信我,在大型代码库中,它确实会使编译速度大大降低。感谢您的富有洞察力的回复。为了澄清起见,我在这里()读到“导入行仅在第一次遇到命名文件时被替换为该文件的内容。之后每次都被忽略。”因此,对于不更改的头文件,使用#import这种方法还会增加编译时间吗?它会被忽略,因为内容不会被附加(就像在计划C中使用#include时一样,因此需要使用include防护)。但您仍然在编译过程中添加工作。相信我,在大型代码库中,它确实会使编译速度大大降低。