Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/17.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++ 如果您已经有Include-guard,是否需要转发声明?_C++ - Fatal编程技术网

C++ 如果您已经有Include-guard,是否需要转发声明?

C++ 如果您已经有Include-guard,是否需要转发声明?,c++,C++,如果您有一组带有include-guard的头文件,那么真的有必要进行转发声明吗 我在代码中这样做是出于习惯,我建议一位同事在他们的代码中添加前向声明,但是当他们问是否真的有必要,因为已经存在include-guard时,我有点不知所措。这似乎是一个很好的实践,但难道不包括守卫就能解决转发声明所带来的所有问题吗 这里有一个例子。假设我有这样一个头文件: //This is the header file of class B class MyClassA; //This is forward d

如果您有一组带有include-guard的头文件,那么真的有必要进行转发声明吗

我在代码中这样做是出于习惯,我建议一位同事在他们的代码中添加前向声明,但是当他们问是否真的有必要,因为已经存在include-guard时,我有点不知所措。这似乎是一个很好的实践,但难道不包括守卫就能解决转发声明所带来的所有问题吗

这里有一个例子。假设我有这样一个头文件:

//This is the header file of class B
class MyClassA; //This is forward declaration    

class B{
    private:
        MyClassA *myClass; //pointer to MyClassA
    public:
        B(){}
        ~B(){};

        void print(MyClassA* myClass); //Passing by reference. Not calling any methods of MyClassA.
}
如果我知道MyClassA.h中有一个include-guard,那么上面的练习会比下面的更好吗?如果是,为什么

#include “MyClassA.h”  

class B{
    private:
        MyClassA *myClass; //pointer to MyClassA
    public:
        B(){}
        ~B(){};

        void print(MyClassA* myClass); //Passing by reference. Not calling any methods of MyClassA.
}

第二个示例是否也会阻止循环声明/多重声明?

您混合了两个不相关的概念

当您只需要名称时,可以使用转发声明

您可以使用include-guard防止在单个翻译单元(即cpp文件)中多次处理同一代码。是否使用include guards取决于.h文件的预期用途。大多数情况下,您不希望在.cpp文件中多次处理文件内容,但在某些用例中,允许这样做是必不可少的。对于后面的使用类别,不能使用“包含防护”

你可以任意组合它们

可以:

使用转发声明和包含保护。 使用转发声明,不要使用包含保护。 不要使用转发声明和使用包含保护。 不使用转发声明,也不使用包含保护。
它不能解决循环依赖问题,通常当您不包含或不能包含标头时,会转发声明。事实上,它们有include-guard并没有真正发挥作用。当可以使用前向声明来避免包含完整的头时,前向声明非常有用,这可以提高编译时间——这在大型项目中非常重要。Include guards针对多个包含/定义进行防护-不同的事情。是否真的有必要进行转发声明?-是的,如果您有相互引用的数据结构。转发声明和包含保护是完全无关的事情。前者使编译器知道某些类型的存在,即使定义还未知。后一种方法防止预处理器多次包含同一个报头,因此可能会重复类型定义或以无休止的include递归结束。实际上,OP被误解为包含一些标题。h作为包含守卫。也许你想更新答案。。。