我主要有两种编译警告:
1。隐含的功能声明
a.c
中的,它有char *foo(char *ptr1, char *ptr2)
,在b.c
中,某些函数使用此foo
函数而没有任何声明,我发现似乎编译器会处理函数{{ 1}}返回值作为整数,甚至我可以传递一些变量少于或多于foo
函数声明
2。枚举类型与其他类型混合
我的目标芯片是ARM11,似乎即使我没有解决这两种编译警告,我的程序也可以毫无问题地运行,但我相信它必然会有一些风险。谁能给我一些很好的例子,这两种编译警告会引起一些意想不到的问题?
同时,如果这两个警告存在潜在风险,为什么c编译器会允许这些警告发生但不能直接将它们设置为错误?任何故事背后?
答案 0 :(得分:2)
隐式声明。例如。你有功能:float foo(float a)
,在你打电话时没有声明。隐式规则将使用以下签名创建自动声明:int foo(double)
(如果传递的参数为float)。因此,您传递的值将转换为double,但foo
需要float
。返回调用代码需要int
,但返回float
。价值观将是一团糟。
枚举与其他类型混合。枚举类型具有可以采用的值列表。如果您尝试为其分配数值,则有可能它不是列出的值之一;如果以后您的代码只需要指定的范围,并且假设其他任何东西都不存在 - 它可能会出错。
答案 1 :(得分:0)
简单示例:
档案:warn.c
#include <stdio.h>
double foo(double x)
{
return myid(x);
}
int
main (void)
{
double x = 1.0;
fprintf (stderr, "%lg == %lg\n", x, foo (x));
return 0;
}
档案:foo.c
double
myid (double x)
{
return x;
}
编译并运行:
$ gcc warn.c foo.c -Wall
warn.c: In function ‘foo’:
warn.c:5: warning: implicit declaration of function ‘myfabs’
$ ./a.out
1 == 0
旧C标准(C90)有这个奇怪的“默认int”规则,并且为了兼容性,即使在最新的编译器中也支持它。