将 C 风格的转换更改为 static_cast 总是安全的吗?
Is it always safe to change a C-style cast to a static_cast?
由于 cppcheck cstyleCast 样式警告,我正在尝试消除代码库中的所有 C 样式转换。
将 C 风格转换为 static_cast
总是安全的吗?
安全的意思是,是否存在旧的 C 风格转换可以正常工作,但 static_cast
会引发错误或未定义行为的情况?
type1 a;
type2 b = (type2)a; // C style cast
type2 b = static_cast<type2>(a); // Is this always a valid replacement for above cast?
C 风格转换通常是 static_cast<>
或 reinterpret_cast<>
与 const_cast<>
的组合。仅用 static_cast<>
替换它可能会出现编译时错误。
我不知道有任何运行时错误的案例。
您可以从 static_cast<>
开始,然后在出现编译时错误的地方添加(或替换为)const_cast<>
。如果在那之后您仍然有编译时错误,则需要 reinterpret_cast<>
。但不要盲目地进行替换——其中一些情况可能是错误。例如,如果数据类型是前向声明但未定义的,则可能需要 reinterpret_cast<>
,这会导致未指定的行为(如果涉及多重继承,肯定会导致问题)。
发现这些类型的错误是此练习提高源代码安全性的原因,也是静态代码分析器标记 C 样式转换的原因。
C 风格转换和 static_cast
不等价。
is there a situation where the old C-style cast would work fine, but static_cast would raise error or undefined behavior?
举个例子:
int main() {
using FI = int(*)();
using FV = void(*)();
FI fi = nullptr;
FV fv = (FV)fi;
//FV fv2 = static_cast<FV>(fi);
}
如果取消注释使用 static_cast
的行,代码将不会编译。
作为旁注,在这种情况下你应该使用 reinterpret_cast
.
由于 cppcheck cstyleCast 样式警告,我正在尝试消除代码库中的所有 C 样式转换。
将 C 风格转换为 static_cast
总是安全的吗?
安全的意思是,是否存在旧的 C 风格转换可以正常工作,但 static_cast
会引发错误或未定义行为的情况?
type1 a;
type2 b = (type2)a; // C style cast
type2 b = static_cast<type2>(a); // Is this always a valid replacement for above cast?
C 风格转换通常是 static_cast<>
或 reinterpret_cast<>
与 const_cast<>
的组合。仅用 static_cast<>
替换它可能会出现编译时错误。
我不知道有任何运行时错误的案例。
您可以从 static_cast<>
开始,然后在出现编译时错误的地方添加(或替换为)const_cast<>
。如果在那之后您仍然有编译时错误,则需要 reinterpret_cast<>
。但不要盲目地进行替换——其中一些情况可能是错误。例如,如果数据类型是前向声明但未定义的,则可能需要 reinterpret_cast<>
,这会导致未指定的行为(如果涉及多重继承,肯定会导致问题)。
发现这些类型的错误是此练习提高源代码安全性的原因,也是静态代码分析器标记 C 样式转换的原因。
C 风格转换和 static_cast
不等价。
is there a situation where the old C-style cast would work fine, but static_cast would raise error or undefined behavior?
举个例子:
int main() {
using FI = int(*)();
using FV = void(*)();
FI fi = nullptr;
FV fv = (FV)fi;
//FV fv2 = static_cast<FV>(fi);
}
如果取消注释使用 static_cast
的行,代码将不会编译。
作为旁注,在这种情况下你应该使用 reinterpret_cast
.