C++ 编码最佳实践

C++ 编码最佳实践,c++,c,C++,C,在头文件中包含#include语句是一种良好的编程实践吗。我个人觉得,尤其是当你浏览别人编写的代码库时,你最终会丢失或者花时间寻找定义,如果这些定义在c文件中,你可能会更快地找到 根据我的经验,在某些情况下,不可能做到你所说的。通常,您会从代码中返回各种其他类,显然,您需要在函数声明中包含有关这些类的信息。在这种情况下,编译器必须已经知道这些其他对象是什么,因此您必须已经在声明中包含一个头,或者提供一个转发声明 由于您最终将包括标头,因此执行额外的转发声明没有实际意义。这当然是一种选择,但在我看

在头文件中包含#include语句是一种良好的编程实践吗。我个人觉得,尤其是当你浏览别人编写的代码库时,你最终会丢失或者花时间寻找定义,如果这些定义在c文件中,你可能会更快地找到

根据我的经验,在某些情况下,不可能做到你所说的。通常,您会从代码中返回各种其他类,显然,您需要在函数声明中包含有关这些类的信息。在这种情况下,编译器必须已经知道这些其他对象是什么,因此您必须已经在声明中包含一个头,或者提供一个转发声明

由于您最终将包括标头,因此执行额外的转发声明没有实际意义。这当然是一种选择,但在我看来,这并不能使代码更清晰

此外,大多数IDE都有一个在包含的文件中查找符号的选项

如果(并且只有如果)您在定义中只需要类/函数,那么您可以投票将标题包含在
*.c
文件中。乍一看可能很清楚,但您可能会发现,在某一天修改类时,您最终会将
#include
移动到
*.h
文件中。

在某些情况下(根据我的经验-大多数情况下),不可能按您所说的去做。通常,您会从代码中返回各种其他类,显然,您需要在函数声明中包含有关这些类的信息。在这种情况下,编译器必须已经知道这些其他对象是什么,因此您必须已经在声明中包含一个头,或者提供一个转发声明

由于您最终将包括标头,因此执行额外的转发声明没有实际意义。这当然是一种选择,但在我看来,这并不能使代码更清晰

此外,大多数IDE都有一个在包含的文件中查找符号的选项


如果(并且只有如果)您在定义中只需要类/函数,那么您可以投票将标题包含在
*.c
文件中。乍一看可能很清楚,但您可能会发现,在某一天修改类时,您最终会将
#include
移动到
*.h
文件中。

简单的答案是肯定的。如果定义/声明由其他头文件中定义/声明的类、类型、结构等组成的类、类型、结构等的特定头文件,则最方便和有效的做法是将这些头文件包含到头文件中

这样,与您正在创建的头文件相关的头文件就会出现

可能存在多次包含文件的问题,这就是为什么大多数头文件要么包含#if以确保只包含一次文件,要么使用#pragma之类的东西确保只包含一次文件

综上所述,您应该设计头文件,以便在头文件的#include多次使用时,头文件只在预处理器输出中出现一次。通过在头文件中包含头文件所依赖的头文件,可以本地化头文件的使用,并确保任何依赖项都可用


此外,通过在头文件中使用“包含依赖项头文件”,如果包含路径不正确,导致依赖项头文件不可用,则很容易找到依赖于不可用头文件的头文件。

简短回答是“是”。如果定义/声明由其他头文件中定义/声明的类、类型、结构等组成的类、类型、结构等的特定头文件,则最方便和有效的做法是将这些头文件包含到头文件中

这样,与您正在创建的头文件相关的头文件就会出现

可能存在多次包含文件的问题,这就是为什么大多数头文件要么包含#if以确保只包含一次文件,要么使用#pragma之类的东西确保只包含一次文件

综上所述,您应该设计头文件,以便在头文件的#include多次使用时,头文件只在预处理器输出中出现一次。通过在头文件中包含头文件所依赖的头文件,可以本地化头文件的使用,并确保任何依赖项都可用


此外,通过在头文件中使用“包含依赖项头文件”,如果包含路径不正确,导致依赖项头文件不可用,则很容易找到依赖于不可用头文件的头文件。

我不希望头文件中包含
,如果只是为了使依赖项在每个源文件的一个位置可见。但这肯定是有争议的


黄金法则是可读性。银色规则遵循现有的实践。

我不希望头文件中包含
,如果只是为了使依赖项在每个源文件的一个位置可见。但这肯定是有争议的


黄金法则是可读性。Silver规则遵循现有实践。

如果头文件不依赖于手动包含的任何其他头文件,则需要使头文件自包含,则它的样式并不糟糕。例如,如果标题包含使用
stdint.h
中的数据类型的声明,那么它应该具有
#include
,而不是期望每个人都以正确的顺序单独包含它

// MyClass.h

#ifndef MYCLASS_HEADER
#define MYCLASS_HEADER

// [header declaration]

#endif // MYCLASS_HEADER
// MyClass.h

#pragma once

// [header declaration]