我想实现这个功能,而不使用任何委托给像sprintf,vprintf等其他功能。但我不知道从哪里开始。有没有这样的实现。我已经搜索了谷歌这一点,但没有发现没有委托给其他功能的任何实现。 请举一个实例。Printf和Scanf C++的实现
-5
A
回答
3
我相信你不能在标准的托管C99或C++ 11实现printf
或scanf
原始地(你可以实现printf
上述putc
或putchar
)。我在这里专注于C。然后printf
是C standard library(又名libc
)的一部分,它应该有一些副作用(涉及stdout
,本身与终端有关)。
A libc
构建在实现特定操作系统基元之上,例如, Linux上的syscalls(请参阅syscalls(2)的列表)。学习musl-libc(特别是它的src/stdio/源代码目录)或GNU glibc源代码,两者都是免费软件。
BTW printf
是一个可变参数函数(见printf(3)),你可以使用stdarg(3)其本身上面编译器特定的魔法(比如__builtin_va_start
在GCC ...)往往建定义自己的可变参数的功能,与你的目标处理器和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
相关问题
- 1. “&”使用printf()和scanf()
- 2. C - 管道使用printf和scanf ..暂停
- 3. C - printf和scanf - 如何终止输入?
- 4. JS中的Scanf和Printf
- 5. C编程具有printf,scanf
- 6. “scanf with printf”vs“fgets with printf”
- 7. 在scanf和printf中使用%
- 8. printf和scanf如何工作?
- 9. printf scanf函数和fflush()
- 10. 使用printf/scanf和%s的漏洞
- 11. printf和scanf的逻辑问题
- 12. 使用arduino语言的printf和scanf
- 13. 复杂含有的scanf和printf
- 14. getchar()等价于scanf(“%c”)和putchar()等价于printf(“%c”)?
- 15. 问题在C简单使用printf和双号scanf函数的
- 16. 嵌套printf和scanf在C中的输出
- 17. winapi scanf printf和数据类型
- 18. ASM x64 scanf printf double,GAS
- 19. 的printf()在同一行的scanf()的
- 20. 为什么printf工作,但scanf不是?
- 21. printf/scanf的输入/输出替代品
- 22. OCJP - 在java中实现printf
- 23. ostream实现使用printf
- 24. scanf和printf如何在while循环中工作?
- 25. Ç - scanf函数,printf的姓名和年龄节目
- 26. 链接列表在C中的实现
- 27. 二叉搜索树C的实现
- 28. scanf,printf和boost :: lexical_cast从根本上是不安全的吗?
- 29. 正确的方式scanf和printf size_t变量(平台无关)
- 30. printf scanf执行顺序正在交换
你的问题太宽泛,不能按原样回答(你是否看到'vprintf'或其他函数的大小,在其中一个“授权”你看到的实现?)。请参阅http://en.wikipedia.org/wiki/Stdarg.h一开始。 – 2014-11-08 15:55:48
有*是*设计背后的原因,它不是为了好玩。另外,printf和scanf家族的功能也相当复杂。 – edmz 2014-11-08 15:57:33