2
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被调用时,这些被执行。这些线是什么意思?执行上述每一行时会发生什么?

4

1 回答 1

6

这主要是另一个__mingw_vprintf执行实际工作的函数的包装器。这里唯一的代码是重新打包变量参数列表。因此,要真正了解 Mingw 是如何做到的,您必须查看该函数以及它调用的任何其他函数。如果您真的对此感兴趣,您应该获得一份 PJ Plauger 的The Standard C Library的副本。他告诉您如何使用、编写和测试标准库中的每个函数。

库代码通常被编译成目标文件(就像您的代码一样),然后以存档格式打包。当您的程序被链接时,所需的库对象将从存档中提取并写入同一个可执行文件。这适用于静态链接库。

对于动态链接库,库代码存档作为一个整体加载到内存中(并且通常由任何需要使用它的程序共享),并且您的程序在操作系统的帮助下进行库调用以方便内存-分享。

对于这两种类型的库,头文件应该只包含宏、类型和函数原型。它不应该包含任何函数定义(那些属于.c文件)。

printf这是标准库存在之前的一个古老版本:链接(<-- 这实际上是可读的(ish))。奇怪的是,第7版看起来很像你上面引用的那个:

#include    <stdio.h>

printf(fmt, args)
char *fmt;
{
    _doprnt(fmt, &args, stdout);
    return(ferror(stdout)? EOF: 0);
}

在这种情况下,_doprnt是用汇编语言实现的。

于 2013-04-07T06:16:13.493 回答