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_t
、int32_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
这似乎更符合习惯。
我在做一个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_t
、int32_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
这似乎更符合习惯。