我最近重新安装了操作系统 - 从 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