想改善这个问题吗?更新问题,使其仅通过editing this post专注于一个问题。
5年前关闭。
我想实现此功能而不使用对sprintf,vprintf等其他功能的任何委托。但是我不知道从哪里开始,有没有这样的实现。我已经在Google上进行了搜索,但是没有找到其他未委托其他功能的实现。
请举一个例子。
最佳答案
我相信您不能在标准托管的C99或C ++ 11中最初实现printf
或scanf
(可以在printf
或putc
之上实现putchar
)。我在这里专注于C。然后printf
是C standard library的一部分(也称为libc
),它应该具有一些副作用(与stdout
有关,而其本身与终端有关)。libc
是在特定于实现的操作系统原语之上构建的,例如在Linux上为syscalls(有关列表,请参见syscalls(2))。研究musl-libc(尤其是其src/stdio/源目录)或GNU glibc源代码,它们都是免费软件。
BTW printf
是一个可变参数函数(请参见printf(3)),您可以使用stdarg(3)定义自己的可变参数函数,该函数通常是在特定于编译器的魔术之上构建的(例如GCC中的__builtin_va_start
...) ,与您的目标处理器和ABI有关。同样,在hosted implementations上,允许编译器使用printf
中的<stdio.h>
做神奇的事情。请参见this answer。
特别是关于printf
和fprintf
,C99标准还需要vprintf(3)和类似的功能,因此很自然地用printf
定义vprintf
。
在大多数实现中,printf
会间接调用类似于putc
的内容,这将填充FILE
内部的缓冲区并有时调用操作系统基元write
-在Linux上请参见write(2)-(例如,至少在缓冲区已满)。
实际上,标准的C ++库是在libc
上利用的(原则上,您可以在OS原语之上编写这样的库)。
请注意,C99标准未在<stdio.h>
之外定义输出例程,因此您需要具有一些特定于实现的输出内容...
PS。如果要实现自己的操作系统,请转到osdev.org
关于c++ - Printf和Scanf C++实现,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26818979/