【问题标题】:Why does cout not print extern "C" variable?为什么 cout 不打印 extern "C" 变量?
【发布时间】:2013-07-12 15:34:34
【问题描述】:

考虑以下代码:

extern "C" {
    #include <lib.h>
}

#include <iostream>

int main() {

    unsigned char a='a';
    unsigned char b=some_struct_in_libh->unsignedchar;

    cout << a << " " << b << endl; //Prints only a

    printf("%u\n",b); //Prints b

    cout << static_cast<int>(b) << endl; //Also prints b

    return 0;
}

为什么会这样?

【问题讨论】:

  • 由于我们不知道some_struct_in_libhunsignedchar是什么以及它们的所有值,我们只能猜测它打印了一些东西,但你看不到它。
  • b 打印成什么?它是一个有效的字符吗?您希望它被视为一个字符(一个字符的字符串)还是一个数字?

标签: c++ c solaris extern sunstudio


【解决方案1】:

它根本不只打印a。相反,您看到的是 cout 将字符类型数据打印为 characters 而不是数字。您的b 是一些不可打印的字符,因此cout 有助于将其打印为空白。

您通过将其转换为 int 找到了解决方案。

编辑:我很确定你的 printf 只是偶然地工作,因为你告诉它期待一个无符号的 int 并给它一个字符(不同的字节数)。

【讨论】:

  • printf 之所以有效,是因为在可变参数函数的情况下,所有类型的“整数类型”都会转换为“int”,除非它们更大。所以代码完全没问题 - 但当然,它打印的是 char 的无符号值,而不是在这个答案中正确处理的字符本身。
  • 赞成描述 cout 将字符类型数据打印为 characters,将不可打印的输入转换为空白。 printf("%c", b); 可能会显示垃圾字符。
  • 这里的事情是我使用了一个外部库,它创建了一些以 char 作为成员的类,但不是将 ASCII 写入它,而是写成 1-byte-int,如果那讲得通。无论如何,感谢您帮助理解打印。
猜你喜欢
  • 2013-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-08
  • 2022-11-01
  • 2017-06-15
  • 2011-05-19
  • 2018-01-29
相关资源
最近更新 更多