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 ++版本是否有可能完全不同?
答案 0 :(得分:0)
Mac上的编译失败可能是由于一个Clang错误(所以g++
在那里运行了Clang,而不是GCC)。之前已经观察过:
可变长度数组是C ++的GNU扩展,而Clang也应该支持它。
至少在某些版本的Clang中,可以通过为变量长度数组类型引入显式typedef
来编译它:
typedef int (*vla)[width][3];
vla img = (vla) ptr;