C语言 函数fmax的隐式声明

oiopk7p5  于 2023-03-22  发布在  其他
关注(0)|答案(3)|浏览(179)

下面的代码:

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

int main(void) {
    printf("%f\n", fmax(1.2, 3.4));
    return 0;
}

如果我编译为:

gcc a.c -o a && ./a

然后我得到预期的输出:

3.400000

如果我尝试启用警告并以C89为目标,我无法让它编译:
一个三个三个一个
我发现fmax()只由C99标准定义,而不是C89。所以问题是:为什么这些完全相同的命令在Mac上工作而不发出任何警告,但在Linux机器上却不行?

wj8zmpe1

wj8zmpe11#

我认为你需要使用-std=c99来构建(参见fmax的手册页)..参见this
fmaxf manual page

fmax(), fmaxf(), fmaxl():
_XOPEN_SOURCE >= 600 || _ISOC99_SOURCE || _POSIX_C_SOURCE >= 200112L;
or cc -std=c99

好像fmax也需要C99

xhv8bpkk

xhv8bpkk2#

来自gcc文档:
5.44 GCC提供的其他内置函数
GCC提供了大量除上述函数之外的内置函数,其中一些函数用于处理异常或变长参数列表的内部使用,由于它们可能会不时更改,因此在此不作说明;我们不建议一般使用这些功能。
其余函数用于优化目的。
GCC包含标准C库中许多函数的内置版本。即使您指定了-fno-builtin选项,以_builtin 为前缀的版本也将始终被视为与C库函数具有相同的含义。(请参阅C方言选项)其中许多函数仅在某些情况下进行优化;如果它们在特定情况下未被优化,则将发出对库函数的调用。
在严格ISO C模式之外(-ansi,-std=c89 or -std=c99),the functions _exit,alloca,bcmp,bzero,dcgettext,dgettext,dremf,dreml,drem,exp10f,exp10l,exp10,ffsll,ffsl,ffs,fprintf_unlocked,fputs_unlocked,gammaf,gammal,gamma,gettext,index,isascii,j0f,j0l,j0,j1f,j1l,j1,jnf,jnl,jn,mempcpy,pow10f,pow 10 l、pow 10、printf_unlocked、rindex、scalbf、scalbl、scalb、signbit、signbitf、signbitl、significandf、significandl、significand、sincosf、sincosl、sincos、stpcpy、strdup、strfmon、toascii、y 0 f、y 0 l、y 0、y1 f、y1 l、y1、ynf、ynl和yn可以被处理为内置函数。其甚至可以在严格的C89模式中使用。
ISO C99函数_Exit、acoshf、acoshl、acosh、asinhf、asinhl、asinh、atanhf、atanhl、atanh、cabsf、cabsl、cabs、cacosf、cacoshf、cacoshl、cacosh、cacosl、cacos、cargf、cargl、carg、casinf、casinhf、casinhl、casinh、casin、catanf、catanhl、catanh、catanl、catan、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、imaxabs、isblank、iswblank、lgammaf、lgammal、lgamma、llabs、llrintf、llrintl、llroundf、llroundl、llroundl、log1pf、log1pl、log1p、log2f、log2l、log2、logbf、logbl、logb、lrintf、lrintl、lrint、lroundf、lroundl、lround,nearbyintf,nearbyintl,nearbyint,nextafterf,nextafterl,nextafter,nexttowardf,nexttowardl,nexttoward,remainderf,remainderl,remainder,remquof,remquol,remquo,rintf,rintl,rint,roundf,roundl,round,scalblnf,scalblnl,scalbln,scalbnf,scalbnl,scalbn,snprintf,tgammaf,tgammal,tgamma,trunf,trunl,trunc,vfscanf,vscanf,vsnprintf和vsscanf作为内置函数处理,除非在严格的ISO C90模式(-ansi或-std=c89)下。

rbpvctlc

rbpvctlc3#

它由C99定义,而不是C89。
man for fmaxf中搜索“C99”

相关问题