我正在用ANSI C编写命令行程序来解析Quake 2地图文件,以报告正在使用的实体和纹理的数量。我的开发机器是MacBook。我正在测试OS X Snow Leopard(32位),Windows XP(32位)和Vista(64位)以及Ubuntu 9.10(32位)。
OS X和GCC 4.2上的代码完美无瑕。其他平台,不是那么完美无缺。
Visual Studio 2005抱怨main()块中间的数组声明 - 在此之前,数组的大小信息不可用 - 应该在顶部声明。修复了通过在顶部声明指针并编写函数来创建数组的问题。
Windows上的Dev-C ++和GCC(3.4)没有任何抱怨。
Windows上的Cygwin和GCC(4.4)抱怨数组下标有char类型。我添加了(int)强制转换来修复它。Ubuntu和GCC(4.4)抱怨忽略了fread的返回值。虽然我在其他地方读到我可能是Ubuntu打包GCC的方式中的一个错误。在我正在使用fread的上下文中似乎这个可能是安全的忽略。警告仅显示-O3标志。
除了Visual Studio 2005之外,我测试过的所有编译器都是GCC的某个版本。追逐所有这些错误和警告是严重的痛苦。到目前为止,我一直在Makefile中使用以下标志:
debug:-pedantic -Wall
发布:-O3
我是否应该使用一组GCC标志来捕获主开发计算机上的所有错误?或者写一次,到处测试一个人生的事实?
答案 0 :(得分:2)
令人憎恶的是,Visual Studio中的C语言(甚至是Visual Studio 2010的测试版!)已经陈旧,并且不支持所有C99功能,并且能够混合声明和可执行语句可能是最烦人的所有。最不可饶恕的选择可能是在这个平台上编译为C ++,即使它需要重新安排你的代码以使其兼具有效的C ++和C.
除此之外,正如肯的评论所说,“一次性测试 - 到处都是生活中的事实”。 Lint可以提供很好的帮助(正如Chris写的那样),但是为了找到语法和语义中的所有不兼容性,你真的需要在几个编译器和系统上编译和测试你的程序。这样做实际上可以帮助您找到代码中的错误和问题,即使您不打算在多个系统上实际运行该程序。
答案 1 :(得分:1)
给自己一份Lint。 Lint是一个静态分析工具,它几乎涵盖了所有编译器错误和警告,然后是一些。作为经常编写针对不同平台和编译器的代码的人,确保代码通过Lint是一个非常好的晴雨表,可以让代码在所有编译器中运行。
近似lint的最佳gcc标志集如下:
-ansi -pedantic -W -Wall -Wundef -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wcast-qual -Wwrite-strings -Weffc++
如果我要编写64位代码,我也常常使用
-Wno-long-long,因为很多编译器都抱怨long long不是c ++类型。
*编辑:修复命令行选项中的复制和粘贴错误
答案 2 :(得分:0)
将-ansi
添加到混音中。规范集合为-ansi -pedantic -Wall
。
那就是说,你可能会发现MSVC的其他怪癖,因为它是一个完全不同的编译器,有自己的警告 - 所以你可能也要调整它的选项。
答案 3 :(得分:0)
使用-Wall和Lint可以节省大量时间,因为它们可以帮助您更好地理解代码。修改代码以最小化安全忽略警告。您将不太可能为难以重现的运行时故障而苦恼。此外,无论谁维护您的代码,都会发现更容易进行更改。
使用Visual Studio时,请探索Lint工具的编译选项。我忘记了它们的位置,它们减慢了你的构建速度,但它们很有帮助。