C++ 转发声明如何隐藏依赖项并导致用户代码跳过必要的重新编译?(谷歌风格指南c+;+;)
转发声明可以隐藏依赖项,允许用户代码在标题更改时跳过必要的重新编译 从 我最近了解到,关于是使用前向声明还是只在头本身中包含头,存在一些争论。在工作中,我们向前声明我们的内部类(不是库代码),并在相应的C++ 转发声明如何隐藏依赖项并导致用户代码跳过必要的重新编译?(谷歌风格指南c+;+;),c++,google-style-guide,C++,Google Style Guide,转发声明可以隐藏依赖项,允许用户代码在标题更改时跳过必要的重新编译 从 我最近了解到,关于是使用前向声明还是只在头本身中包含头,存在一些争论。在工作中,我们向前声明我们的内部类(不是库代码),并在相应的.cpp中包含包含这些类的标题。如果.cpp中的代码从未使用该类,则可以完全跳过包含;它通过了打字 假设我们有以下代码和文件 #pragma once //test.h class Test{ public: void foo() const; }; MyClass根本不需要知道测试的
.cpp
中包含包含这些类的标题。如果.cpp
中的代码从未使用该类,则可以完全跳过包含;它通过了打字
假设我们有以下代码和文件
#pragma once
//test.h
class Test{
public:
void foo() const;
};
MyClass根本不需要知道测试的大小就可以访问doWork()
。因此,我们不需要包含Test.h
。只有真正起作用的函数(doWork
)才需要包含在其cpp中。通过使用转发声明,对Test.h
的更改不会导致MyClass.cpp的任何重新编译。但在我看来,这是一件好事,因为这不是必要的重新编译
免责声明:《谷歌风格指南》中有一个与void*相关的示例,但我不确定它是否与此要点相关;因为这只是一个不正确的函数调用,而不是必要的重新编译。另外,我相信如果函数是在.cpp中定义的,并且它们包含了适当的类,那么这个特定的示例将被消除。此外,如果它与我在这个问题中的要点有关,那么缓解与void*相关的问题听起来不足以完全禁止使用远期声明
所以,我的问题是——有没有任何具体的例子表明它会跳过必要的重新编译
编辑:
这不是链接帖子的副本,因为该答案只包含一个void*回复。我在这个问题中说,我正在寻找任何其他的例子,从虚空*给出。IMO完全放弃使用前向声明是一个相当深奥的问题(希望在现代c++中不常见)。在我看来,创建一个规则来禁止使用引用,包括传递引用,因为类成员引用可以通过默认副本轻松生成悬空引用这不是链接帖子的副本,因为该答案只包含一个void*响应。我在这个问题中说,我正在寻找任何其他的例子,从虚空*给出。IMO完全放弃使用前向声明是一个相当深奥的问题(希望在现代c++中不常见)。在我看来,创建一个规则来禁止使用引用,包括passby引用,因为类成员引用可以通过默认副本轻松生成悬空引用。
//test.cpp
#include<iostream>
#include "test.h"
void Test::foo() const
{
std::cout << "test" << std::endl;
}
#pragma once
//worker_function.h
class Test;
void doWork(const Test&);
//worker_function.cpp
#include"worker_function.h"
#include"Test.h"
void doWork(const Test& obj){
obj.foo(); //must include for compilation
}
#pragma once
//myclass.h
class Test;
class MyClass{
public:
void passthrough(const Test& obj);
};
//myclass.cpp
#include "myClass.h"
#include "worker_function.h"
void MyClass::passthrough(const Test& obj){
doWork(obj);
}