为什么这个C ++代码不会编译?

时间:2013-08-06 11:22:15

标签: c++ gcc types iostream endianness

我的任务是设置一个使用TTK(触发工具包)提供服务的Debian服务器。

然而,该软件似乎是从1997年开始的,并且没有维护,并且默认情况下不会使用GCC(g++)进行编译(v4.7.2)。

某些错误源于未指定std命名空间,我已经修复了这些错误。

但是,我遇到了一个似乎包含在硬件兼容性软件中的类,特别是它的read函数。

根据我的理解,这个类应该是抽象硬件的端点(或类似性质的东西):

public:
    Architecture()
    {
      short y = 256;
      short *x=&y;
      alpha_byte_ordering = ( *( (char*) (x) + 1) ) == 1 ? 1 : 0;
      if (alpha_byte_ordering)
        fprintf(stderr, "Architecture: detected alpha byte ordering.\n");
      else fprintf(stderr, "Architecture: detected non-alpha byte ordering.\n");
    }

    int read(istream &is, short *s)
    {
      if (!is.read(s, sizeof(short))) return 0;
      if (!alpha_byte_ordering) reverse_byte_order(s);
      return 1;
    }

还有许多其他重载的read函数,它们都会吐出错误,例如:

Architecture.H: In member function ‘int Architecture::read(std::istream&, short int*)’:
Architecture.H:31:34: error: no matching function for call to ‘std::basic_istream<char>::read(short int*&, long unsigned int)’

似乎这段代码不知道C ++标准,我认为{C}标准指定istream::read应该接受字符数组(char *),而不是short *和{ {1}}(我实际上读的是here,而不是标准版。)

我是否错误地解释了这段代码?自1997年以来,这方面的标准是否有所改变?或者这段代码开始时是不起作用的(我非常怀疑这是因为有关于它的文章)?

最后,我该如何解决这个问题?将double *转换为s C风格似乎可以消除错误,但我不确定它是否能解决问题。

1 个答案:

答案 0 :(得分:0)

read函数想要一个指向字符类型的指针(例如你的char*)作为第一个参数。您需要使用reinterpret_cast正确地转换指针。

is.read(reinterpret_cast<char*>(s), sizeof(*s))