Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何实现打印功能?_C++_C_Linux_Windows_Printing - Fatal编程技术网

C++ 如何实现打印功能?

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;

大多数时候,当我需要在标准库中未实现的特定功能时,我会尝试自己实现它。我还创建静态库来使用和重用代码

所以我想写一个独立于标准库的测试程序。此程序缺少打印功能。打印通常是计算机程序的主要部分

如何在C或C++ ++?/P>中实现一个简单的打印功能,如<代码> PuCARCARE(<代码> >或<代码> CUT/CODE>? 我的代码:

#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:在注释中要求澄清是有效的,但如果该澄清导致回答,您应该发布答案,而不是在注释中回答。