为什么clang报告相同的类型不兼容?

时间:2017-06-04 03:34:50

标签: c++ clang

我想使用malloc()返回的指针作为多维数组的名称,因此我转换了指针。编译时,我收到一个错误:

clang++ -o cast cast.cpp
cast.cpp:29:12: error: assigning to 'int8_t (*)[width]' from incompatible type
      'int8_t (*)[width]'
  int8line = (int8_t (*)[width])(array);
           ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~
1 error generated.

但是在Linux上的同一平台(OS X)和icpc上使用g++/icpc进行编译,不会引发任何错误。

更新:宽度是可变的,因此不能是const

经过测试的编译器是:

  

Mac OS X

icpc (ICC) 17.0.4 20170411

clang --version
Apple LLVM version 8.1.0 (clang-802.0.42)
Target: x86_64-apple-darwin16.6.0
Thread model: posix
     

Linux 2.6.32:

icpc (ICC) 14.0.0 20130728
g++ (GCC) 4.4.6 20110731

结果应为:

icpc -std=c++11 -o cast cast.cpp && ./cast 5
0   1   2   3   4
5   6   7   8   9

0   1   2   3   4
5   6   7   8   9

最小可编辑代码(已更新):

#include <iostream>
#include <cstdint>

using namespace std;

int main(int argc, char* argv[])
{
  if (argc != 2)
  {
    cerr << "needs one argument\n";
    exit(EXIT_FAILURE);
  }
  long width = atol(argv[1]);

  int8_t *array = static_cast<int8_t(*)>(malloc(sizeof(int8_t)*2*width));
  for (int i = 0; i < 2*width; i++)
    array[i] = i;

  for (int j = 0; j < 2; j++)
  {
    for (int i = 0; i < width; i++)
    {
      cout << static_cast<int>(array[i+j*width]);
      if (i < (width-1))
        cout << '\t';
    }
    cout << '\n';
  }

  cout << '\n';

  int8_t (*int8line)[width];
  int8line = (int8_t (*)[width])(array);
  for (int j = 0; j < 2; j++)
  {
    for (int i = 0; i < width; i++)
    {
      cout << static_cast<int>(int8line[j][i]);
      if (i < (width-1))
        cout << '\t';
    }
    cout << '\n';
  }

  free(array);
  exit(EXIT_SUCCESS);
}

2 个答案:

答案 0 :(得分:1)

我相信这是因为它是常规的非常数变量。其他编译器可能会识别此变量的不变性,但这种猜测不是标准规定的。

如果使变量width保持不变,它应该可以工作:

const long width = 5;

答案 1 :(得分:0)

拥有非constexpr width称为varaible length array,而不是标准C ++。

int8line的类型因此处于奇怪状态,int8_t (*)[width]不是实际类型,导致编译器产生令人困惑的错误消息。

作为Zbynek Vyskovsky - kvr000 pointed out,使用const long width = 5将起作用,这是因为它使width成为常量表达式,这在编译时是已知的。这使得数组不是可变长度数组。

您应该使用std::vector代替。