C 函数fmax的隐式声明

C 函数fmax的隐式声明,c,ansi,c89,C,Ansi,C89,我有以下代码: #include <stdio.h> #include <math.h> int main(void) { printf("%f\n", fmax(1.2, 3.4)); return 0; } 然后我得到了预期的输出: 3.400000 如果我尝试启用警告并以C89为目标,则无法将其编译: $gcc-Wall-Wextra-std=c89-pedantic-Wstrict原型a.c-o a a、 c:在函数“main”中: a、 c

我有以下代码:

#include <stdio.h>
#include <math.h>

int main(void) {
    printf("%f\n", fmax(1.2, 3.4));
    return 0;
}
然后我得到了预期的输出:

3.400000
如果我尝试启用警告并以C89为目标,则无法将其编译:

$gcc-Wall-Wextra-std=c89-pedantic-Wstrict原型a.c-o a
a、 c:在函数“main”中:
a、 c:5:5:警告:函数“fmax”的隐式声明[-Wimplicit函数声明]
a、 c:5:5:警告:格式“%f”要求参数类型为“double”,但参数2的类型为“int”[-Wformat]
/tmp/cc8d2iQl.o:在函数“main”中:
a、 c:(.text+0x1d):对“fmax”的未定义引用
collect2:ld返回了1个退出状态
$gcc-Wall-Wextra-std=c89-pedantic-Wstrict原型a.c-lm-o a
a、 c:在函数“main”中:
a、 c:5:5:警告:函数“fmax”的隐式声明[-Wimplicit函数声明]
a、 c:5:5:警告:格式“%f”要求参数类型为“double”,但参数2的类型为“int”[-Wformat]

我发现
fmax()。因此,问题是:为什么这些完全相同的命令在Mac电脑上工作时不会发出任何警告,而在Linux机器上却不会发出任何警告?

我认为您需要使用-std=c99构建(请参阅fmax手册页)。。看

似乎fmax还需要gcc提供的C99:

5.44 GCC提供的其他内置功能

GCC提供了大量的内置函数,而不是 如上所述。其中一些用于处理过程中的内部使用 异常列表或变长参数列表,并且不会 记录在此处,因为它们可能会不时发生变化;我们没有 建议一般使用这些功能

其余的函数用于优化目的

GCC包括中许多函数的内置版本 标准C库。前缀为_builtin的版本将始终 甚至被视为与C库函数具有相同的含义 如果指定-fno内置选项。(参见C方言选项)许多 只有在某些情况下才对这些函数进行优化;如果是 在特定情况下未优化,对库函数的调用 将被发射

在严格的ISO C模式(-ansi,-std=c89或-std=c99)之外 _退出,alloca,bcmp,bzero,dcgettext,DGETEXT,dremf,dreml,drem,exp10f,exp10l,exp10,ffsll,ffsl,ffs,fprintf_解锁, fputs_unlocked,gammaf,gammal,gamma,gettext,index,isascii,j0f, j0l,j0,j1f,j1l,j1,jnf,jnl,jn,mempcpy,pow10f,pow10l,pow10, printf_unlocked,rindex,scalbf,scalbl,scalb,signbit,signbitf, 符号位,有效位,有效位,有效位,sincosf,sincosl, sincos,stpcpy,strdup,strfmon,toascii,y0f,y0l,y0,y1f,y1l,y1, ynf、ynl和yn可以作为内置函数处理。所有这些 函数具有前缀为_builtin的相应版本,其 甚至可以在严格的C89模式下使用

ISO C99功能_Exit、acoshf、acoshl、acosh、asinhf、asinhl、, asinh,atanhf,atanhl,atanh,cabsf,cabsl,cabs,cacosf,cacosf, cacosh,cacosh,cacosl,cacos,cargf,cargl,carg,casinf,casinhf, 卡西尔,卡西,卡西尔,卡西,卡坦夫,卡坦夫,卡坦尔,卡坦夫, 卡坦,卡坦,cbrtf,cbrtl,cbrt,ccosf,ccoshf,ccoshl,ccosh, ccosl,ccos,cexpf,cexpl,cexp,cimagf,cimagl,cimag,conjf,conjl, conj,copysignf,copysignl,copysign,cpowf,cpowl,cpow,cprojf, cprojl,cproj,crealf,creall,creal,csinf,csinhf,csinhl,csinh, csinl,csin,csqrtf,csqrtl,csqrt,ctanf,ctanhf,ctanhl,ctanh, ctanl,ctan,erfcf,erfcl,erfc,erff,erfl,erf,exp2f,exp2l,exp2, expm1f,expm1l,expm1,fdimf,fdiml,fdim,fmaf,fmal,fmaxf,fmaxl, fmax,fma,fminf,fminl,fmin,hypotf,hypotl,hypot,ilogbf,ilogbl, ilogb、IMAXAB、isblank、iswblank、lgammaf、lgammal、lgamma、LLAB、, llrintf,llrintl,llrint,llroundf,llroundl,llround,log1pf,log1pl, log1p,log2f,log2l,log2,logbf,logbl,logb,lrintf,lrintl,lrint, lroundf,lroundl,lround,nearbyintf,nearbyintl,nearbyint, nextafter,nextafter,nextafter,nextowardf,nextowardl, 下一步,remainder F,remainder L,remainder,remquof,remquol, remquo,rintf,rintl,rint,roundf,roundl,round,scalblnf,scalblnl, scalbln,scalbnf,scalbnl,scalbn,snprintf,tgamaf,tgamal,tgama, truncf、truncl、trunc、vfscanf、vscanf、vsnprintf和vsscanf是 作为内置函数处理,除非在严格的ISO C90模式(-ansi或 -标准=c89)


它由C99定义,但不是C89

在中搜索“C99”

第二个问题仍然存在。为什么具有完全相同的源代码和参数的
gcc
在Mac上不会发出任何警告?找到并打开包含的math.h;它应该指向bin/mathcalls.h。在这里面,找到fmaxf定义并检查它是否在一个#ifdef u USE ISO99MY Mac的
/usr/include/math.h
不包括
bin/mathcalls.h
,而是包括一个
体系结构/i386/math.h
,它不包含对
\uu USE\uISO99
的任何引用。即使如此,这些警告是否应该由
gcc
本身生成,而不管系统上有什么可用的警告?不,都是在头文件中定义或宏化的。您会在您的include中查找fmax还是fmax,并将其发布到问题中?所有
fmax*()
函数都在架构
math.h
中定义。但是如果
gcc
没有警告我使用非标准函数,那么
-std
的目的是什么?我还能做什么来得到警告呢?我没有投反对票。我发现我被“在C89中,所有函数只接受浮点参数的类型double”的说法严重误导了,这意味着所有函数都在C89中可用,而不是
*f
版本。现在编辑那个页面。但是,我还是不能
fmax(), fmaxf(), fmaxl():
_XOPEN_SOURCE >= 600 || _ISOC99_SOURCE || _POSIX_C_SOURCE >= 200112L;
or cc -std=c99