1

我正在用 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 in 的上下文中,这似乎是可以安全忽略的。该警告仅与 -O3 标志一起出现。

除了 Visual Studio 2005,我测试的所有编译器都是 GCC 的某个版本。追查所有这些错误和警告是一件非常痛苦的事情。到目前为止,我一直在 Makefile 中使用以下标志:

调试:-pedantic -Wall

释放:-O3

我应该使用一组 GCC 标志来捕获我的主要开发机器上的所有错误吗?还是一次编写,到处测试是生活中的事实?

4

4 回答 4

2

令人恼火的是,Visual Studio 中的 C 方言(甚至是 Visual Studio 2010 的 beta 版!)已经过时,并且不支持所有 C99 功能,并且能够混合声明和可执行语句可能是其中最令人恼火的。最不邪恶的选择可能是在这个平台上编译为 C++,即使它需要重新安排你的代码以使其同时有效的 C++ 和 C。

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

于 2010-02-21T05:35:54.533 回答
1

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

近似 lint 的最佳 gcc 标志集类似于:

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

我也经常用

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

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

于 2010-02-21T05:04:02.870 回答
0

添加-ansi到混合物中。规范集是-ansi -pedantic -Wall

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

于 2010-02-21T04:45:25.047 回答
0

使用 -Wall 和 Lint 可以节省很多时间,因为它们会帮助你更好地理解代码。重新编写代码以尽量减少可安全忽略的警告。您将不太可能为难以重现的运行时故障而苦恼。此外,维护您的代码的人会发现更容易进行更改。

When you are using Visual Studio, explore the compile options for Lint like tools. I forget where they are, and they slow down your build, but they are helpful.

于 2010-02-21T11:58:59.890 回答