为什么在 Xubuntu 上编译 C 代码会失败?

为什么在 Xubuntu 上编译 C 代码会失败?

我最近重新安装了操作系统 - 从 openSUSE 切换到 Xubuntu。我备份了所有科学数据后处理脚本(用 C 或 FORTRAN 编写)。我最近在 SUSE 上使用并运行的代码出现错误,错误主要与输出字符数据有关...救命!

错误消息示例:

FBDcode.c:144:2: warning: format ‘%s’ expects argument of type ‘char *’,  
                 but argument 3 has type ‘char (*)[100]’ [-Wformat]

我的.c 文件的第 144 行是:

fscanf(infile_PP, "%s %lf\n", &temp_str, &solvent_molec_wt);

变量 temp_str 先前以这种方式定义:

char temp_str[100];

答案1

代码为何生成警告

你想通过temp_str 没有 &因为数组默认是通过引用传递的。

如果需要传递i数组的特定成员,则可以&temp_str[i]不带警告传递,包括&temp_str[0]

为什么代码在 openSUSE 上编译成功,但在 Ubunutu 上却生成警告

我的电脑上有 openSUSE 12.2 和 Ubuntu 12.10,我尝试了几种方法。两者都使用 gcc 4.7.1。

openSUSE 不会生成编译器警告,因为默认情况下不会启用相应的警告。如果您在 openSUSE 上编译代码时启用了警告(最常见的是-Wall),您将看到与在 Ubuntu 上相同的编译器警告。

Ubuntu 使用dpkg-buildflags设置默认设置。默认情况下,Ubuntu 使用-Wformat(这会生成有关 的警告fscanf,并且会在使用 时包含在内-Wall)和-Werror=format-security,这会将 的警告转换为-Wformat-security错误(并且不是包括在-Wall)。

dpkg-buildflags --dump您可以使用和在终端中查看这些设置dpkg-buildflags --status

什么是编译器警告?

程序员很快就能了解编译器错误。当代码中有拼写错误、语法错误,或者编译器能够检测到某些其他问题时,编译器会发出错误然后停止。在这些情况下,我们说代码不会编译。

但更多情况下,编译器认为可能存在错误,或注意到合法代码可能存在某些问题。在这些情况下,编译器会发出警告,但通常会完成代码的编译。

查看警告很重要。大多数情况下,警告应被视为错误,即使在代码编译时也应予以修复。如果忽略警告或一开始就看不到警告,程序员可能会错误地认为代码没有问题。生成的代码可能运行良好或看起来运行良好。但这些警告通常意味着有问题即将发生。当条件稍后发生变化时,代码可能会产生错误的结果,甚至导致未定义的行为,从而导致崩溃。很难找到这种错误,因为程序员从一开始就假设代码没有问题。

在 gcc 中,命令行选项 -Wall 会显示大多数警告。以 -W 开头的选项与警告有关。这些选项位于手册页中。在本例中,-Wall 会显示所有(实际上是大多数)警告。始终使用 -Wall 选项是个好主意。GNU gcc 文档有关于警告和设置的更多信息。

一本很好的新书解释了如何使用 Make 文件和其他工具来设置编译选项21 世纪来自 O'Reilly Media 的另一本非常好的书是自动工具来自 No Starch Press

相关内容