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

Abh*_*kar 2 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;
}
Run Code Online (Sandbox Code Playgroud)

上面的行是与stdio函数对应的库的一部分printf.当printf被调用时,这些被执行.这些线是什么意思?当执行上述每一行时会发生什么?

lus*_*oog 6

这主要是另一个__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用汇编语言实现.