2014-11-08 55 views
-5

我想实现这个功能,而不使用任何委托给像sprintf,vprintf等其他功能。但我不知道从哪里开始。有没有这样的实现。我已经搜索了谷歌这一点,但没有发现没有委托给其他功能的任何实现。 请举一个实例。Printf和Scanf C++的实现

+2

你的问题太宽泛,不能按原样回答(你是否看到'vprintf'或其他函数的大小,在其中一个“授权”你看到的实现?)。请参阅http://en.wikipedia.org/wiki/Stdarg.h一开始。 – 2014-11-08 15:55:48

+1

有*是*设计背后的原因,它不是为了好玩。另外,printf和scanf家族的功能也相当复杂。 – edmz 2014-11-08 15:57:33

回答

3

我相信你不能在标准的托管C99或C++ 11实现printfscanf原始地(你可以实现printf上述putcputchar)。我在这里专注于C。然后printfC standard library(又名libc)的一部分,它应该有一些副作用(涉及stdout,本身与终端有关)。

A libc构建在实现特定操作系统基元之上,例如, Linux上的syscalls(请参阅syscalls(2)的列表)。学习musl-libc(特别是它的src/stdio/源代码目录)或GNU glibc源代码,两者都是免费软件。

BTW printf是一个可变参数函数(见printf(3)),你可以使用stdarg(3)其本身上面编译器特定的魔法(比如__builtin_va_startGCC ...)往往建定义自己的可变参数的功能,与你的目标处理器和ABI。另外,在hosted implementations上,编译器被允许用从<stdio.h>做神奇的事情。请参阅this answer

printf问候和fprintf具体而言,C99标准还要求vprintf(3)和类似的功能,所以它是在自然的vprintf某种方式来定义printf

在大多数实施方式中,printf将间接调用类似的东西,以putc,这将填充FILE内部缓冲器并调用操作系统原始write有时 - Linux上看到write(2) - (例如,至少当所述缓冲器是满的)。

实际上,标准C++库在libc(原则上,您可以在OS基元上面编写这样一个库)时充分利用。

注意的是,C99标准没有定义输出程序<stdio.h>者外,所以你需要有一些具体的实施-输出的事情...

PS。如果你想实现你自己的操作系统,转到osdev.org