c/c++语言开发共享数学库现在是否包含在glibc中?

当我尝试从终端编译这个简单的代码时:

#include int main(void) { printf("%fn",sqrt(10)); return 0; } 

运用

gcc main.c

命令,它被编译,a.out给出正确的答案。 这意味着数学函数被添加到C标准库中,它自动链接。

但是如果在Eclipse IDE中编译相同的代码而不向属性添加任何库,则会给出未定义的引用错误。 这意味着数学函数不是C标准库的一部分。

真相是什么?

    您可能会看到常量折叠 ,在数学函数调用中使用常量将导致编译器计算函数并省略对数学库的调用。

    如果我们查看GCC提供的其他内置函数的文档( 强调我的 ):

    GCC包含标准C库中许多function的内置版本。 即使指定-fno-builtin选项,前缀为_ builtin的版本也始终被视为与C库函数具有相同的含义。 (参见C方言选项)许多这些function仅在某些情况下得到优化; 如果它们在特定情况下未被优化,则发出对库函数的调用。

    如果我们看一下使用以下代码的这个稍微修改过的实例 :

     #include  #include  int main(void) { printf("%dn",(int)sqrt(25)); return 0; } 

    我们看到gcc生成的以下程序集:

     movl $5, %esi movq %rax, %rdi movl $0, %eax call printf 

    所以我们看到5被移入esi ,其中x64 abi是调用函数的第二个参数,并且是sqrt(25)的结果,根本没有调用sqrt

    请注意你缺少:

     #include  

    更新

    内置命令是gcc扩展 ,上面的内置链接解释了哪些用于哪种模式,它们都应该与标准function具有相同的含义。

    如果您担心您的代码符合标准,那么您可以查看本手册中的Options Controlling C Dialect部分。 您可以使用-std指定要遵循的标准和-pedantic ,以便在使用不符合标准或-pedantic-errors的function时启用警告,以使警告成为错误。 所以例如使用

     gcc -std=c99 -pedantic 

    当您使用符合C99标准的function(例如零长度数组)时会生成警告。

    我们也可以使用-fno-builtin来禁用一些内置文件,文档说:

    不识别不以_ builtin作为前缀开头的内置函数。 有关受影响的函数的详细信息,请参阅GCC提供的其他内置函数,包括那些在使用严格ISO C一致性的-ansi或-std选项时不是内置函数的函数,因为它们没有ISO标准含义。 […]

    在某些编译器上,默认情况下启用标准库函数。 关于编译

     int main(){ printf("Hello World"); return 0; } 

    这个代码在GCC 4.7.1上编译给出了警告:

     [Warning] implicit declaration of function 'printf' [-Wimplicit-function-declaration] [Warning] incompatible implicit declaration of built-in function 'printf' [enabled by default] 

      以上就是c/c++开发分享数学库现在是否包含在glibc中?相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

      ctvol管理联系方式QQ:251552304

      本文章地址:https://www.ctvol.com/c-cdevelopment/559680.html

      (0)
      上一篇 2021年1月27日
      下一篇 2021年1月27日

      精彩推荐