我想做的是在我手头的一些源文件中找到所有从double或float类型显式转换为其他类型的操作。是否有gcc内置方法可以实现这一点?
编程语言是C。
谢谢!
-Wold-style-cast
警告标志,在所有此类转换中触发警告。-Weverything
开关确定它是否有任何警告,这些警告将对特定编码模式触发(但请注意,这对于几乎任何其他目的都没有用处--clang已禁用了默认情况下触发各种合法代码形式的警告)。但是,在这种情况下,Clang没有任何警告会在此类转换上触发。由于强制转换是明确合法的,并且执行奇怪的转换的正确方法,因此gcc很可能不会包含警告它们的选项。
相反,根据您的源代码有多大,您可能可以这样做:
grep '\(double|float\) ' *
为了给您提供所有的双精度或浮点数变量。由于C语言不是一种常规语言,使用shell工具将其解析为双精度或浮点数变量列表并不容易,但如果您的源代码足够小,则手动完成这个过程很容易。
grep '([^()]*)[ ()]*\(your list of variable names\)' *
-Wconversion
选项用于警告可能会改变值的隐式转换(double
是大型类型),而-Wno-sign-conversion
选项则禁止在有符号和无符号整数之间进行转换时发出警告(这样就可以减少不必要的警告)。否则,我没有看到任何标准的替代方案...
最坏的情况是您可以直接在源文件中查找这些关键字...
-Wconversion
来捕获“意外”的转换,而明确(且有意)的转换产生的噪音是无法忍受的。 - Damon虽然我所知道的编译器没有这样的选项,但Gimpel的FlexeLint可以满足您的要求:
$ cat tst.c
int main (void)
{
int i = 0, j = 0;
float f = 0.0;
double d = 0.0;
i = (int) f;
j = (int) d;
d = (double) f;
f = (float) d;
i = (int)j;
j = (unsigned) i;
return (int) j;
}
$ flexelint -w1 +e922 tst.c
FlexeLint for C/C++ (Unix) Vers. 9.00j, Copyright Gimpel Software 1985-2012
--- Module: tst.c (C)
_
i = (int) f;
tst.c 7 Note 922: cast from float to int
_
j = (int) d;
tst.c 8 Note 922: cast from double to int
_
d = (double) f;
tst.c 9 Note 922: cast from float to double
_
f = (float) d;
tst.c 10 Note 922: cast from double to float
shell returned 4
(double)
或(float)
吗? - Robert Harvey