为什么gcc报告“隐含的函数声明'轮''?

时间:2009-11-23 15:21:28

标签: c gcc compiler-warnings

我有以下C代码:

#include <math.h>

int main(int argc, char ** argv)
{
    double mydouble = 100.0;
    double whatever = round(mydouble);

    return (int) whatever;
}

当我编译它时,我收到警告:

round_test.c: In function ‘main’:
round_test.c:6: warning: implicit declaration of function ‘round’
round_test.c:6: warning: incompatible implicit declaration of built-in function ‘round’

我对C生锈了,但我认为#include将round()的声明带入了范围。我已经检查了我的ANSI标准(C99是我唯一的副本),它确认了math.h标题中存在round()函数。我在这里缺少什么?

编辑:编译器是Ubuntu上的GCC 4.3.2(intrepid,IIRC)。运行gcc -E给出:

$ gcc -E round_test.c | grep round
# 1 "round_test.c"
# 1 "round_test.c"
# 2 "round_test.c" 2
    double whatever = round(mydouble);

所以显然没有在标题中找到定义。

6 个答案:

答案 0 :(得分:17)

我看到你正在使用gcc。

默认情况下,gcc使用类似于C89的标准。您可能希望“强制”使用C99标准(它符合的部分)

gcc -std=c99 -pedantic ...

来自GCC Manual

  

默认情况下,GCC会提供一些   C语言的扩展   罕见的情况与C发生冲突   标准。请参阅C的扩展   语言家庭。使用-std   上面列出的选项将禁用   他们冲突的这些扩展   选择C标准版本。   您也可以选择扩展名   明确的C语言版本   使用-std = gnu89(对于带有GNU的C89   扩展)或-std = gnu99(对于C99   使用GNU扩展)。默认值,如果   没有C语言方言选项   给定的是-std = gnu89;这会改变   在将来的某个版本中,-std = gnu99   当C99支持完成时。一些   属于C99的功能   标准被接受为扩展名   C89模式。

答案 1 :(得分:3)

gcc安装,系统标头或编译选项必定存在问题。

尝试使用-E进行编译。这将显示预处理器输出的内容 - 包括包含哪些标头以及它们中的内容。在我的Ubuntu Linux系统上,它大约有1000行输出,包括:

extern double round (double __x) __attribute__ ((__nothrow__)) __attribute__ ((__const__));

答案 2 :(得分:3)

你需要告诉gcc你想要C99,以及你想要在libm中链接:

gcc -std=c99 -lm round_test.c

答案 3 :(得分:0)

您输入的代码使用GCC 4.0.1在MacOS X 10.5.8上完全编译。如果使用选项'-Wall -Wextra'进行刺激,它会抱怨未使用的参数argc和argv - 不是材料。

您是否在机器上查看了<math.h>

您是否尝试过使用'-stc = c99'等选项?

答案 4 :(得分:0)

C99就是答案,但完整的故事有点复杂。我一直在玩这个的原因是我试图编译一个为Windows编写的库,它有自己的“优化”round()定义。我收到一个链接器错误,告诉我该定义与内置程序冲突,所以我删除了定义(和声明)。一旦我这样做,我开始得到“隐含声明错误”。

似乎默认的编译模式(没有-std = c99标志)既不符合C89也不符合C99:如果它符合C89,你应该能够提供round()的自定义定义而不会发生冲突,如果它符合C99,声明应该在math.h中。

答案 5 :(得分:-2)

您需要与数学库链接。因此,在编译时,请务必添加-lm标志。