【问题标题】:Wrong char output for Generic print C通用打印 C 的错误字符输出
【发布时间】:2021-10-25 10:27:22
【问题描述】:

我有一个带有 _Generic 的宏用于打印

#define PRINT(data)                                 \
        _Generic((data),                            \
        char:print_char)(data)

这是 print_char 的实现

void print_char(char data){
    printf("%c\n",data);
}

问题是当我调用 PRINT('t') 例如它打印 116 而不是 t 时,我发现的解决方案是在 PRINT 语句中添加 (char),如 PRINT((char)'t')。 问题是如何在没有演员表的情况下打印字符?

【问题讨论】:

标签: c generics printing char


【解决方案1】:

由于历史原因,追溯到早期 C 缺乏类型系统并将所有内容都视为 int 的时候,很多我们期望是 char 的东西实际上仍然是 int。语言中有很多例子:

  • 'A' 这样的字符文字是int 类型。
  • getchar 返回一个 int
  • EOFint
  • ctype.h 函数使用 int 而不是 char

等等。这是一个众所周知的语言缺陷。 C++ 很早就改变了其中的一些缺陷,但 C 直到今天仍然坚持不完善。

【讨论】:

  • 感谢您的澄清!
【解决方案2】:

在 C 中,诸如't' 之类的纯字符常量具有int 类型。

PRINT 宏可以更改为:

define PRINT(data)                                 \
        _Generic((data),                           \
        int:print_char)(data)

如果希望PRINT 对“正常”整数值执行其他操作,那么这将不是一个合适的解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-18
    • 2013-12-08
    • 2021-06-15
    • 1970-01-01
    • 1970-01-01
    • 2012-09-02
    • 2021-05-25
    • 1970-01-01
    相关资源
    最近更新 更多