8

我要做的是在我拥有的一些源文件中找到从 double 类型或 float 类型到任何其他类型的所有显式转换。是否有内置的 gcc 方法可以做到这一点?语言是 C。谢谢!

4

5 回答 5

10

如果您的 C 代码也可以在 C++ 模式下编译,则可以使用 g++ 的-Wold-style-cast警告标志来触发所有此类强制转换的警告。

您可以通过使用其开关确定 Clang 是否有任何将针对特定编码模式触发的警告-Weverything(但请注意,这对于几乎任何其他目的都没有用 - clang 具有默认禁用警告,这些警告会触发各种形式的合法代码)。但是,在这种情况下,clang 没有任何在此类强制转换时触发的警告。

于 2012-04-29T22:52:00.093 回答
2

-Wconversion警告可能改变值的隐式转换(double是大类型),并-Wno-sign-conversion禁用有关有符号和无符号整数之间转换的警告(因此会减少不必要的警告)。否则我没有看到任何标准的替代方案......

在最坏的情况下,您可以直接在源文件中查找这些关键字...

于 2012-04-25T15:28:17.937 回答
2

由于强制转换是明确合法的,并且是执行奇怪转换的正确方法,gcc 极不可能包含警告它们的选项

相反,根据您的来源有多大,您可能能够逃脱:

grep '\(double|float\) ' *

给你所有的 double 或 float 变量。由于 c 不是常规语言,因此将其解析为双精度或浮点变量列表并非易事(使用 shell 工具),但如果您的源代码足够小,则手动执行此操作很容易。

grep '([^()]*)[ ()]*\(your list of variable names\)' *

从那里将向您展示您的许多演员表。

于 2012-04-25T16:01:46.453 回答
2

虽然我知道的编译器没有这个选项,但 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
于 2014-08-02T07:45:24.857 回答
0

好吧,我认为没有这样的选择。毕竟,编译器会发出警告,以警告您可能无意中所做的事情。然而,显式转换基本上是一种告诉编译器“闭嘴,我知道我在做什么”的方法。

于 2012-04-25T15:43:28.990 回答