我有以下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);
所以显然没有在标题中找到定义。
答案 0 :(得分:17)
我看到你正在使用gcc。
默认情况下,gcc使用类似于C89的标准。您可能希望“强制”使用C99标准(它符合的部分)
gcc -std=c99 -pedantic ...
默认情况下,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
标志。