转换为指向运行时确定大小

时间:2018-03-17 05:11:24

标签: c++ pointers casting g++ runtime

C ++标准允许这种转换吗?我能够使用g ++ 5.4(在linux中运行)编译它,但不能用g ++ 4.2(在OSX中运行)编译它。

char* ptr;
char (*img)[width][3] = (char (*)[width][3])ptr;

'宽度'是在运行时确定的整数。 g ++ 4.2抛出:

cannot initialize a variable of type 'char (*)[width][3]'
  with an rvalue of type 'char (*)[width][3]'

这对我没有任何意义。

(PS:第一次编译时我真的感到很惊讶)

修改

用g ++ 5.4编译的小代码

#include <iostream>
int main(){
    char* ptr;
    int width;
    std::cin >> width;
    char (*img)[width][3] = (char (*)[width][3])ptr;
}

用g ++ 4.2无法编译的Mac现在不适合我,所以我无法重现错误。如@xskxzr与Compiler Explorer的评论所示,it compiles in g++4.1。但是,it doesn't compile in clang,抛出了我之前说过的相同错误:

<source>:9:12: error: cannot initialize a variable of type 'char (*)[width][3]' with an rvalue of type 'char (*)[width][3]'
    char (*img)[width][3] = (char (*)[width][3])ptr;
           ^                ~~~~~~~~~~~~~~~~~~~~~~~
1 error generated.
Compiler returned: 1

问题是:

如何解释输出错误?

对于OSX,g ++版本是否有可能完全不同?

1 个答案:

答案 0 :(得分:0)

Mac上的编译失败可能是由于一个Clang错误(所以g++在那里运行了Clang,而不是GCC)。之前已经观察过:

可变长度数组是C ++的GNU扩展,而Clang也应该支持它。

至少在某些版本的Clang中,可以通过为变量长度数组类型引入显式typedef来编译它:

typedef int (*vla)[width][3];
vla img = (vla) ptr;