Printf不是c语言的一部分。从stdio.h执行PRINTF代码时实际发生了什么?

时间:2013-04-07 06:14:34

标签: c printf stdio

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时会执行这些操作。这些线是什么意思?当执行上述每一行时会发生什么?

1 个答案:

答案 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以汇编语言实现。