大多数情况下,当我需要在标准库中未实现的特定功能时,我会尝试自己实现它。我还创建了静态库来使用和重用代码。
所以我在考虑编写一个独立于标准库的测试程序。该程序缺少打印功能。通常,打印是计算机程序的主要部分。
如何在C或C ++中实现像putchar()
或cout
这样简单的打印功能?
我的代码:
#define TRUE 1
#define FALSE 0
typedef int INT_32;
typedef unsigned int size_t;
struct block {
INT_32 v;
size_t x;
};
void f1(struct block *s);
int f2(void *addr);
int main(void)
{
struct block blk;
f1(&blk);
//print blk members
int res = f2(&blk);
// print res
return 0;
}
void f1(struct block *s)
{
s->v = -1;
s->x = 1
}
int f2(void *addr)
{
if (addr) {
return TRUE;
}
else {
return FALSE;
}
}
答案 0 :(得分:8)
对于POSIX系统,我能提出的最基本的一个是:
void putchar(int ch)
{
const unsigned char character = (unsigned char) ch;
write(STDOUT_FILENO, &character, 1);
}
这只是要求write()
系统调用写入stdout
。在非POSIX系统上,您将不得不使用其他东西。
错误被忽略,因为putchar()
的原型不包含返回值。
请注意,这假设您没有“正确”缓冲的高级I / O函数,因为它基本上实现了属于该组的功能,但非常简单并且没有缓冲。 See the manual page了解更多相关信息。
int
- 格式字符被删除为无符号字符,以符合putchar()
的规范。我删除了按位-AND,因为它硬编码8位字节,这是丑陋和毫无意义的。这应该没问题,并保留适当的位。
你将不得不使用系统调用,毕竟C中没有“原生”打印。
答案 1 :(得分:2)
I / O必须依赖于平台 - 因为I / O可以在从窗口管理器设备上下文到UART的任何类型的设备上执行;这就是它被标准库抽象的原因。
然而,这不是唯一的抽象层次;例如,在Linux或Windows等操作系统中,stdout映射到文件描述符,该文件描述符指的是设备驱动程序(可能省略了某些层) - 涉及多层软件。如果输出到屏幕,它会变得更加复杂,因为窗口管理器和GPU也可能也参与其中。
您当然可以跳过stdio层并访问底层的OS API,BIOS或设备驱动程序,但是在运行完整的现代OS direct 输出到某些输出设备的系统中你可以轻易做的事情(因为其他应用程序可能正在使用该资源)。
在裸机嵌入式系统中,没有操作系统或内核本身不支持I / O;你可以做你喜欢的事;但在这种情况下,答案是真正的平台特定的,并取决于您选择输出的设备;它可能是一个显示器,或者它可能是一个串行端口,但它完全是硬件特定的。
答案 2 :(得分:0)
您可以定义一个宏来打印字符:
#define my_putchar(x) write(0, &(x), 1)
/* write - write to a file descriptor
0 - standard output file descriptor
&(x) - pointer to the specified character
1 - number of characters to be printed
*/
供参考:
unsigned int write(int fd, const void *buf, unsigned int count);