根据经验,以下工作(gcc和VC ++),但它是否是有效且可移植的代码?
typedef struct
{
int w[2];
} A;
struct B
{
int blah[2];
};
void my_func(B b)
{
using namespace std;
cout << b.blah[0] << b.blah[1] << endl;
}
int main(int argc, char* argv[])
{
using namespace std;
A a;
a.w[0] = 1;
a.w[1] = 2;
cout << a.w[0] << a.w[1] << endl;
// my_func(a); // compiler error, as expected
my_func(reinterpret_cast<B&>(a)); // reinterpret, magic?
my_func( *(B*)(&a) ); // is this equivalent?
return 0;
}
// Output:
// 12
// 12
// 12
&a
的位解释为a
B型,这是一种有效/最好的方法吗?(偏离主题:对于那些想知道为什么我正在尝试这样做的人,我正在处理两个需要128位内存的C库,并使用不同内部的结构名字 - 很像我的例子中的结构。我不想要memcopy,我不想在第三方代码中乱砍。)
答案 0 :(得分:2)
在C ++ 11中,如果两种类型布局兼容,则完全允许这样做,对于相同且具有标准布局的结构,这是正确的。 See this answer for more details
你也可以在以前版本的C ++中将这两个结构放在同一个联合中,这有一些保证能够以相同的顺序访问相同的数据成员(数据成员的“公共初始序列”)以用于不同的结构类型。
在这种情况下,是的,C风格的演员表是等效的,但reinterpret_cast
可能更惯用。