Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C/GCC警告-写一次,到处测试?_C_Gcc Warning_Quake2 - Fatal编程技术网

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

C/GCC警告-写一次,到处测试?,c,gcc-warning,quake2,C,Gcc Warning,Quake2,我正在用ANSI C编写一个命令行程序来解析Quake 2地图文件,以报告使用了多少实体和纹理。我的开发机器是MacBook。我正在测试OS X雪豹(32位)、Windows XP(32位)、Vista(64位)和Ubuntu 9.10(32位) 该代码在OSX和GCC4.2上是完美的。其他平台,并非完美无缺 VisualStudio 2005抱怨在主(块)块中间的数组声明——数组的大小信息直到那时才可用——应该在顶部声明。通过在顶部声明一个指针并编写一个函数来创建数组,修复了这个问题 Win

我正在用ANSI C编写一个命令行程序来解析Quake 2地图文件,以报告使用了多少实体和纹理。我的开发机器是MacBook。我正在测试OS X雪豹(32位)、Windows XP(32位)、Vista(64位)和Ubuntu 9.10(32位)

该代码在OSX和GCC4.2上是完美的。其他平台,并非完美无缺

VisualStudio 2005抱怨在主(块)块中间的数组声明——数组的大小信息直到那时才可用——应该在顶部声明。通过在顶部声明一个指针并编写一个函数来创建数组,修复了这个问题

Windows上的Dev-C++和GCC(3.4)没有问题

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

Ubuntu和GCC(4.4)抱怨忽略了fread的返回值。尽管我在别处读到我可能是Ubuntu打包GCC的一个bug。在我使用fread的上下文中,似乎可以安全地忽略这一点。警告仅与-O3标志一起出现

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

调试:-学究式-墙壁

释放:-O3


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

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


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

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

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

-ansi -pedantic -W -Wall -Wundef -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wcast-qual -Wwrite-strings -Weffc++ -ansi-pedantic-W-Wall-Wundef-Wstrict原型-Wmissing原型-Wmissing声明-Wcast qual-Wwrite strings-Weffc++ <>我也经常使用Wno -龙长,如果我要编写64位代码,因为很多编译器抱怨长长不是C++类型。 -Wno-long-long
*编辑:修复命令行选项中的复制和粘贴错误足够令人恼火了,Visual Studio中的C语言(甚至是Visual Studio 2010的beta!)很旧,不支持所有C99功能,并且能够混合声明和可执行语句可能是最令人恼火的。最不可能的选择可能是编译为C++而不是在这个平台上编译,即使需要重新排列代码,使其既有效C++又C.


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

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


使用VisualStudio时,请探索类似Lint工具的编译选项。我忘了它们在哪里,它们减慢了构建速度,但它们很有帮助。

好吧,到处写一次测试是一个事实,但这与前面提到的问题无关:无警告构建和工作程序(很大程度上)是独立的。没有编译器标志可以“捕获所有错误”。这并不是说它会影响任何东西,而是说您有两次
-Wwrite字符串。