Kaw*_*iKx 2 c eclipse glibc math.h
当我尝试从终端编译这个简单的代码时:
#include<stdio.h>
int main(void)
{
printf("%f\n",sqrt(10));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
运用
gcc main.c
命令,它被编译,a.out给出正确的答案.这意味着数学函数被添加到C标准库中,它自动链接.
但是如果在Eclipse IDE中编译相同的代码而不向属性添加任何库,则会给出未定义的引用错误.这意味着数学函数不是C标准库的一部分.
真相是什么?
您可能会在这里看到常量折叠,其中在数学函数调用中使用常量将导致编译器计算函数并省略对数学库的调用.
如果我们查看GCC提供的其他内置函数的文档(强调我的):
GCC包含标准C库中许多功能的内置版本.即使指定了-fno-builtin选项,以_ builtin为前缀的版本也始终被视为与C库函数具有相同的含义.(参见C方言选项)许多这些功能仅在某些情况下得到优化; 如果它们在特定情况下未被优化,则会发出对库函数的调用.
如果我们看一下使用以下代码的这个稍微修改过的实例:
#include <stdio.h>
#include <math.h>
int main(void)
{
printf("%d\n",(int)sqrt(25));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我们看到生成的以下程序集gcc:
movl $5, %esi
movq %rax, %rdi
movl $0, %eax
call printf
Run Code Online (Sandbox Code Playgroud)
所以我们看到5移动到esi其在64 ABI是第二个参数来调用函数,并且结果sqrt(25)也没有电话sqrt都没有.
请注意你缺少:
#include <math.h>
Run Code Online (Sandbox Code Playgroud)
更新
内置命令是一个gcc扩展,上面的内置链接解释了哪些用于哪种模式,它们都应该与标准功能具有相同的含义.
如果您担心您的代码符合标准,那么您可以查看本手册中的Options Controlling C Dialect部分.您可以使用-std指定要遵循的标准,并-pedantic在使用不符合标准的功能时启用警告或-pedantic-errors使警告出错.所以例如使用
gcc -std=c99 -pedantic
Run Code Online (Sandbox Code Playgroud)
当您使用符合C99标准的功能(例如零长度数组)时会生成警告.
我们也可以-fno-builtin用来禁用一些内置文件,文件说:
不识别不以_ builtin作为前缀开头的内置函数.有关受影响的功能的详细信息,请参阅GCC提供的其他内置函数,包括那些在使用严格ISO C一致性的-ansi或-std选项时不是内置函数的函数,因为它们没有ISO标准含义.[...]
| 归档时间: |
|
| 查看次数: |
648 次 |
| 最近记录: |