【问题标题】:How to implement a printing function?如何实现打印功能?
【发布时间】:2016-06-13 15:17:32
【问题描述】:

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

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

putchar()cout 这样简单的打印功能如何用C 或C++ 实现?

我的代码:

#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;
    }
}

【问题讨论】:

  • C 和 C++ 是不同的语言。选一个。如果已经有标准的,不要定义自制布尔常量或类型。
  • 取决于系统。哪个系统?
  • @Cheersandhth.-Alf,Windows 或 Linux..
  • 在这种情况下write。在 Windows 中,您将使用 WriteFile 进行流输出或使用 WriteConsole... 进行直接控制台窗口输出。
  • @Cheersandhth.-Alf :在评论中要求澄清是有效的,但如果澄清导致答案,您应该发布答案而不是在评论中回答。

标签: c++ c linux windows printing


【解决方案1】:

嗯,对于 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() 的规范。我按位删除了,因为它硬编码了 8 位字节,这是丑陋且毫无意义的。这应该没问题并保持适当的位。

您将不得不使用系统调用,毕竟 C 中没有“本机”打印。

【讨论】:

  • 能否解释一下ch & 0xff的用法
  • 是否依赖于系统?它可以在 Unix 操作系统上运行吗?
  • @GauravSehgal 我添加了一些文字,并简化了代码。
  • @GulluButt 实际上,我使用的是 POSIX。我应该注意到这一点。
【解决方案2】:

I/O 必须依赖于平台——因为 I/O 可以在从窗口管理器设备上下文到 UART 的任何类型的设备上执行;这就是为什么它被标准库抽象出来的原因。

但是,这不是唯一的抽象级别;例如,在 Linux 或 Windows 等操作系统中,stdout 映射到引用设备驱动程序的文件描述符(可能省略了某些层) - 涉及多个软件层。如果输出到屏幕上,它会变得更加复杂,因为那时窗口管理器和 GPU 也可能参与其中。

您当然可以跳过 stdio 层并访问底层操作系统 API、BIOS 或设备驱动程序,但在运行完整现代操作系统的系统中直接输出到某些输出设备不是您会轻而易举地做一些事情(例如,其他应用程序可能正在使用该资源)。

另一方面,在没有操作系统或内核本身不支持 I/O 的裸机嵌入式系统中;你可以做你喜欢的事;但在这种情况下,答案确实是特定于平台的,并且取决于您选择输出到的设备;例如,它可能是显示器,也可能是串行端口,但它完全是特定于硬件的。

【讨论】:

    【解决方案3】:

    你可以定义一个宏来打印字符:

    #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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-13
      • 1970-01-01
      • 1970-01-01
      • 2020-06-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多