如何实现打印功能?

时间:2016-06-13 15:17:32

标签: c++ c linux windows printing

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

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

如何在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;
    }
}

3 个答案:

答案 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);