代码之家  ›  专栏  ›  技术社区  ›  C.D. Reimer

C/GCC警告-只写一次,到处测试?

  •  1
  • C.D. Reimer  · 技术社区  · 15 年前

    我正在用ANSIC编写一个命令行程序来解析一个Quake2映射文件,以报告正在使用的实体和纹理的数量。我的开发机器是MacBook。我正在测试OSXSnowLeopard(32位)、WindowsXP(32位)和Vista(64位)以及Ubuntu9.10(32位)。

    该代码在OSX和GCC4.2上是完美的。其他的平台,不是那么完美。

    Visualstudio2005抱怨在main()块的中间有一个数组声明——直到那时数组的大小信息才可用——应该在顶部声明。修正了这个问题,在顶部声明一个指针,然后编写一个函数来创建数组。

    Windows上的dev-c++和gcc(3.4)没有任何投诉。

    Windows上的cygwin和gcc(4.4)抱怨数组下标的类型为char。我添加了(int)强制转换来解决这个问题。

    Ubuntu和GCC(4.4)抱怨忽略了fread的返回值。尽管我在别处读到,我可能是Ubuntu打包gcc的方式中的一个bug。在我使用氟利昂的情况下,这个似乎是可以忽略的。警告仅与-o3标志一起出现。

    除了Visual Studio 2005,我测试的所有编译器都是gcc的某个版本。追查所有这些错误和警告是非常痛苦的。直到现在,我还在makefile中使用以下标志:

    调试:-书呆子-墙

    释放:-O3

    是否有一组gcc标志可以用来捕获主开发机器上的所有错误?还是写一次,到处测试都是生活的一个事实?

    4 回复  |  直到 15 年前
        1
  •  1
  •   Beanz    15 年前

    给自己拿一份皮棉。lint是一个静态分析工具,它几乎涵盖了编译器的全部错误和警告,以及一些错误。作为一个经常编写针对不同平台和编译器的代码的人,确保代码通过lint是让代码在所有编译器中运行的一个很好的晴雨表。

    近似lint的最佳gcc标志集如下所示:

    -ansi -pedantic -W -Wall -Wundef -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wcast-qual -Wwrite-strings -Weffc++

    我也经常用

    -Wno-long-long
    如果我要编写64位代码,因为许多编译器抱怨长长不是C++类型。

    *编辑:修复命令行选项中的复制和粘贴错误

        2
  •  2
  •   Thomas Padron-McCarthy    15 年前

    令人恼火的是,Visual Studio中的C语言(甚至是Visual Studio 2010的测试版!)是旧的,不支持所有的C99功能,能够混合声明和可执行语句可能是最令人恼火的。最坏的选择可能是编译为C++,而不是在这个平台上编译,即使它需要重新排列代码以使其既有效C++又有效C.。

    除此之外,正如肯的评论所说,“写一次测试无处不在是生活的一个事实”。lint是一个很好的帮助(如Chris所写),但是要找到语法和语义上的所有不兼容之处,您真正需要在几个编译器和系统上编译和测试您的程序。这样做实际上有助于发现代码中的错误和问题,即使您不打算在多个系统上实际运行程序。

        3
  •  0
  •   Eli Bendersky    15 年前

    添加 -ansi 混合起来。规范集是 -ansi -pedantic -Wall .

    这就是说,你可能会发现MSVC还有其他的怪癖,因为它是一个完全不同的编译器,有自己的警告——所以你可能也需要调整它的选项。

        4
  •  0
  •   rleir    15 年前

    使用-wall和lint可以节省很多时间,因为它们可以帮助您更好地理解代码。重新编写代码以最小化安全忽略警告。您将不太可能为难以重现的运行时失败而苦恼。此外,维护您的代码的人会发现更容易进行更改。

    在使用Visual Studio时,请浏览类似lint的工具的编译选项。我忘了它们在哪里,它们减慢了你的建造速度,但它们是有用的。