int printf (const char *__format, ...)
{
register int __retval;
__builtin_va_list __local_argv; __builtin_va_start( __local_argv, __format );
__retval = __mingw_vprintf( __format, __local_argv );
__builtin_va_end( __local_argv );
return __retval;
}
以上行是与stdio
函数对应的printf
库的一部分。调用printf
时会执行这些操作。这些线是什么意思?当执行上述每一行时会发生什么?
答案 0 :(得分:5)
这主要是另一个功能__mingw_vprintf
的包装器,可以完成真正的工作。这里唯一的代码是重新打包变量参数列表。因此,要真正了解Mingw是如何做到的,您必须查看该函数以及它调用的任何其他函数。如果您真的对此感兴趣,您应该获得P.J. Plauger的标准C库的副本。他告诉你如何使用,编写和测试标准库中的每个函数。
通常将库代码编译为目标文件(就像您的代码一样),然后以归档格式打包。程序链接后,所需的库对象将从存档中提取并写入相同的可执行文件中。这适用于静态链接的库。
对于动态链接库,库代码存档作为一个整体加载到内存中(通常由任何需要使用它的程序共享),并且您的程序在操作系统的帮助下进行库调用促进记忆共享。
对于这两种类型的库,头文件只应包含宏,类型和函数原型。它不应包含任何函数定义(属于.c
文件)。
这是标准库存在之前的printf
的古老版本:link(< - 这个实际上是可读的(ish))。奇怪的是,7th-edition版本看起来很像你引用的版本:
#include <stdio.h>
printf(fmt, args)
char *fmt;
{
_doprnt(fmt, &args, stdout);
return(ferror(stdout)? EOF: 0);
}
在这种情况下,_doprnt
以汇编语言实现。