如果我修改了实现细节,是不是总是需要重新编译?

问题描述 投票:0回答:1

例如我有以下头文件:

#ifndef A_H
#define A_H

class A {
public:
    void doSomething();
};

#endif

以下cpp文件作为实现:

#include "A.h"

void A::doSomething() {
    // Implementation
}

然后我得到了另一个 B.cpp 文件,其中只包含 A.header 文件,但不使用 A 类。

现在,如果我对 A 类进行一些更改,例如,也许 doSomething 函数的返回类型?

需要重新编译B.cpp文件吗?

如果B.cpp文件创建一个A类对象并使用成员func,情况会有所不同吗?

我从 gpt 得到的答案:“如果修改 A 类的实现(cpp 文件),那么任何包含 A 类头文件的 cpp 文件都需要重新编译。这是因为实现的更改会影响 A 类的功能的名称以及其成员的使用方式。”

但是我觉得没有意义,我想只有当我修改了A接口并且我也使用A的接口时,我才必须重新编译B文件。

提前致谢

c++ visual-c++ compiler-construction c++17 header-files
1个回答
1
投票

您的理解是正确的,之前提供给您的信息是不正确的。

  1. 如果仅修改实现(即 A.cpp)但不更改接口(即 A.h): 如果B.cpp包含A的头文件但不使用A类,则不需要重新编译B.cpp。 B.cpp 的编译依赖于接口(A.h),而不是实现(A.cpp)。所以这种情况下改变A.cpp不会影响B.cpp的编译。

  2. 如果更改接口(例如修改A.h中

    doSomething
    的返回类型): 如果B.cpp包含A.h并使用A类,那么您需要重新编译B.cpp,因为对接口的更改会影响A类在B.cpp中的使用方式。如果 B.cpp 包含 A.h 但不使用 A 类,您仍然不需要重新编译 B.cpp,因为接口的更改不会影响 B.cpp。

综上所述,是否需要重新编译取决于你是否更改了接口以及问题文件是否使用了接口被更改的类。仅更改实现而不更改接口不需要重新编译包括头文件的不相关代码。

© www.soinside.com 2019 - 2024. All rights reserved.