0

我主要有两种编译警告:

1.函数的隐式声明

in a.c,它有char *foo(char *ptr1, char *ptr2), in b.c,一些函数在foo没有任何声明的情况下使用这个函数,我发现编译器似乎会将函数foo返回值视为整数,甚至我可以传递一些变量少于或多于foo函数声明

2. 枚举类型与其他类型混合

我的目标芯片是ARM11,看来即使我不解决这两种编译警告,我的程序也可以运行没有任何问题,但我相信这背后一定有一些风险。谁能给我一些很好的例子说明这两种编译警告会导致一些意想不到的问题?

同时,如果这两个警告有潜在的风险,为什么c编译器允许这些警告发生而不直接将它们设置为错误?背后有什么故事吗?

4

2 回答 2

2

隐式声明。例如,您有 function: float foo(float a),在您调用它时没有声明它。隐式规则将创建具有以下签名的自动声明:(int foo(double)如果传递的参数是浮点数)。因此,您传递的值将转换为 double,但foo期望float. 与返回调用代码期望相同int,但返回float。价值观将是一团糟。

枚举与其他类型混合。枚举类型具有它可以采用的值列表。如果您尝试为其分配数值,则它可能不是列出的值之一;如果稍后您的代码只需要指定的范围并假定没有其他东西可能存在 - 它可能行为不端。

于 2014-10-29T07:57:02.023 回答
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”规则,为了兼容性,即使在最新的编译器中也支持它。

于 2014-10-29T08:05:17.447 回答