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

C++ 为什么clang报告相同的类型为不兼容?,c++,clang,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); ^ ~~~~~~~~~~~~~~~~

我想使用
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.
但是在同一平台(OSX)上使用
icpc
和在Linux上使用
g++/icpc
编译时,不会抛出错误

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


经过测试的编译器包括:

MacOSX

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

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

#包括
#包括
使用名称空间std;
int main(int argc,char*argv[])
{
如果(argc!=2)
{

cerr我认为这是因为它是一个规则的非常量变量。其他编译器可能会认识到这个变量的不变性,但这种猜测并不是标准规定的

如果将变量
width
设置为常量,则该变量应能工作:

const long width = 5;

具有非CONSTEPRP<代码>宽度< /C> >,称为标准C++。< /P> 因此,

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

由于使用
const long width=5
可以工作,这是因为它使
width
成为一个常量表达式,这在编译时是已知的。这使数组不是一个可变长度数组


你可能应该使用<代码> STD::“向量< /COD>”。在C++中使用<代码> MalOC/<代码>,在C.中使用它几乎是奇怪的,这使得我相信你的问题是,X部分(你问题的最重要部分)的答案。最好使用

new int8_t[width]
std::vector
。在GCC下编译,但不使用clang。这可能是clang不接受指向可变长度数组的指针的原因。
int8_t数组[2][width]在标准C++中,不允许使用< /COD>。没有人能够提出一个建议,它在与其他C++结构混合时为什么不使用C++代码中的<代码> MalOC ?但是,如何解释<代码>长宽=ATOL(ARGV〔1〕)。
不会更改结果?@Eli4ph:因为变量仍然保持有效的常量。某些编译器会将其作为扩展进行检测,但标准规范通常不要求这样做。
const long width = 5;