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