我发现-Wconversion
gcc / clang选项对于查找代码错误非常有用。但也有很多情况下隐式类型转换是安全的
例如:
double a_small_double = 3.5;
/*implicitly convert double to int*/
int i = floor(a_small_double);
int len = 3;
/*implicitly convert int to size_t*/
double *p = (double*)malloc(len*sizeof(double));
我应该每次都添加一个显式的类型转换(根本不简洁),或者只是忽略它们?
答案 0 :(得分:2)
是的,消除警告是一种好习惯,这也是Herb Sutter和Andrei Alexandrescu的建议 C ++编码标准:101规则,指南和最佳实践( {{ 3}} 的):
你的编译器是你的朋友。如果它发出某种警告 构建,通常在您的代码中存在潜在问题。
成功的构建应该是静默的(无警告)。如果他们不是, 你会很快养成略读输出的习惯,你会的 想念真正的问题。 (见第2项。)
要摆脱警告:a)理解它;然后b)改写你的 代码消除警告,使人类和人类更清楚 代码完成你想要的编译器。
即使程序似乎在第一个程序中运行正常,也要这样做 地点。即使你肯定警告是良性的,也要这样做。 即使是良性警告也可能掩盖后来指向真实的警告 危险。
当然,可能会出现这种情况,例如大型遗留代码库,但对于新项目而言,这应该是您的目标。
答案 1 :(得分:1)
您应该每次都手动投射。
例如,每次将convert和int转换为size_t时,都应确保int为正。
assert( len >= 0 ) ;