【发布时间】:2014-05-29 09:56:30
【问题描述】:
对 GCC 的内置函数理解有困难,感到很困惑。
库函数和内置函数有什么区别?
有没有内置函数可以做而库函数不能做的事情?
我可以编写一个库函数来执行与内置函数 printf 相同的任务吗?如何判断输入参数的类型(%f、float 或 double)?
GCC 内置函数的机器指令不存储在库中,对吧?他们在哪里?
在链接的时候,如何控制这些内置函数代码的放置位置?
-
为什么有时我会在链接时出现错误消息,例如“未定义对 __builtin_stdarg_start 的引用”
// main.c #include <stdio.h> int main(void) { printf("hello world!\n"); return 0; }gcc -c main.c, nm 显示main.o中没有符号printf,(只有main(T)和puts(U)),为什么?
【问题讨论】:
-
(用T称为内置)
-
您可以创建自己的 printf。查看 stdargs.h 标头。
-
GCC (很可能)将您的
printf()优化为puts(),因为您只是将一个简单的字符串传递给printf(),而没有任何进一步的参数。见:linux.die.net/man/3/puts -
对于 mem* 和 str* 函数,GCC 似乎主要在大小恒定时使用 '_builtin' 进行优化(在编译时已知)