decltype 可以减少重新编译吗

Can decltype make less recompilation

我在做一个cpp项目,假设有这么一段代码:

// header1.h
struct Test {
    int a;
    bool func(int b) { return a < b; }
};

// header2.h
#include "header1.h"
void myfunc(int aa) {
    Test t;
    t.a = aa;
    bool res = t.func(3);
    // something else
}

// header3.h
#include "header1.h"
void myfunc(decltype(Test::a) aa) {   // CHANGED HERE
    Test t;
    t.a = aa;
    bool res = t.func(3);
    // something else
}

我总是像 headedr2.h 一样编码。但是今天遇到这样的情况,header1.h中的Test::a以后可能会变成uint8_tint32_t等类型。如果它改变了,header2.h 也应该改变。 (我不想进行任何隐式转换。)

也就是说,如果header1.h改变了,我必须改变header2.h,结果,包括header2.h在内的所有文件都必须重新编译。

现在,我在想是否可以像 header3.h 一样使用 decltype 来避免重新编译。换句话说,我问如果我编码 header3.h 而不是 header2.h,是否可以避免在更改 Test::a 的类型后重新编译包含 header3.h 的文件在 header1.h?

不,如果您更改 header1.h,则必须重新编译包含 header1.h.

的所有内容

原因是:编译器如何在不知道其参数类型或不知道您在 myfunc 中使用的 Test 类型的情况下生成 myfunc 的代码?

如果您更改 struct Test,改变其成员的类型,使用 Test 的过时声明生成的所有代码都可能无法在链接阶段编译,或者可能在运行时有不可预测的行为。

从编译开始,应重新编译所有包含 "header1" 的文件。

使用 decltype(Test::a) 需要 #include 而直接使用 int 则不需要(定义无论如何都需要它,但可以在 cpp 中)。

使用 decltype(Test::a) 可以避免在多个地方更新代码。

decltype(Test::a) 设置别名可能有意义,例如

struct Test {
    using type_a = int;
    type_a a;
    bool func(type_a b) const { return a < b; }
};

并使用 Test::type_a 这似乎更符合习惯。