C++ 如何实现打印功能?
大多数时候,当我需要在标准库中未实现的特定功能时,我会尝试自己实现它。我还创建静态库来使用和重用代码 所以我想写一个独立于标准库的测试程序。此程序缺少打印功能。打印通常是计算机程序的主要部分 如何在C或C++ ++?/P>中实现一个简单的打印功能,如<代码> PuCARCARE(<代码> >或<代码> CUT/CODE>? 我的代码:C++ 如何实现打印功能?,c++,c,linux,windows,printing,C++,C,Linux,Windows,Printing,大多数时候,当我需要在标准库中未实现的特定功能时,我会尝试自己实现它。我还创建静态库来使用和重用代码 所以我想写一个独立于标准库的测试程序。此程序缺少打印功能。打印通常是计算机程序的主要部分 如何在C或C++ ++?/P>中实现一个简单的打印功能,如 PuCARCARE( >或 CUT/CODE>? 我的代码: #define TRUE 1 #define FALSE 0 typedef int INT_32; typedef unsigned int size_t;
#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;
}
}
对于POSIX系统,我能想到的最基本的方法是:
void putchar(int ch)
{
const unsigned char character = (unsigned char) ch;
write(STDOUT_FILENO, &character, 1);
}
这只要求write()
系统调用对stdout
进行写入。在非POSIX系统上,您必须使用其他东西
错误被忽略,因为putchar()
的原型不包含返回值
请注意,这假设您没有“适当”的缓冲高级I/O函数,因为它基本上实现了属于该组的函数,但非常简单且没有缓冲。更多关于这方面的信息
int
-格式字符被分解为无符号字符,以符合putchar()
的规范。我删除了按位编码,因为它硬编码了8位字节,这既丑陋又毫无意义。这应该是好的,并保持适当的位
您将不得不使用系统调用,毕竟C中没有“本机”打印。I/O必然依赖于平台,因为I/O可以在任何类型的设备上执行,从窗口管理器设备上下文到UART;这就是它被标准库抽象的原因 然而,这不是唯一的抽象层次;例如,在Linux或Windows等操作系统中,stdout映射到一个文件描述符,该描述符引用一个设备驱动程序(可能省略了某些层)——涉及多个软件层。如果输出到屏幕,那么它会变得更加复杂,因为窗口管理器和GPU可能也会参与其中 当然,您可以跳过stdio层,访问底层的操作系统API、BIOS或设备驱动程序(例如),但在一个运行完整现代操作系统的系统中,直接输出到某个输出设备并不是一件容易的事情(因为除此之外,其他应用程序可能正在使用该资源)
在没有操作系统或内核本身不支持I/O的裸机嵌入式系统中;你可以做你喜欢做的事;但在这种情况下,答案确实是特定于平台的,取决于您选择输出到的设备;例如,它可能是一个显示器,也可能是一个串行端口,但它完全是硬件专用的。您可以定义一个宏来打印字符:
#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);
您能否解释一下
ch&0xff
的使用是否依赖于系统?它能在Unix操作系统上工作吗?@GauravSehgal我添加了一些文本,并简化了代码。@GulluButt我实际上使用POSIX。我应该注意到,C和C++是不同的语言。挑一个。如果已有标准布尔常量或类型,则不要定义自制布尔常量或类型。具体取决于系统。哪个系统?@cheers-sandhth.-Alf,windows还是Linux..在这种情况下写入。在Windows中,您可以使用WriteFile
进行流输出,或者使用WriteConsole…
进行直接控制台窗口输出。@cheers-handhth.-Alf:在注释中要求澄清是有效的,但如果该澄清导致回答,您应该发布答案,而不是在注释中回答。