根据经验,以下工作(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
- reinterpret_cast 有效吗?
- C 风格的演员阵容是否等效?
- 目的是让这些位位于
&a
解释为
B 型,这是有效/最佳方法吗?
(题外话:对于那些想知道的人why我正在尝试这样做,我正在处理两个需要 128 位内存的 C 库,并使用具有不同内部名称的结构 - 与我的示例中的结构非常相似。我不需要 memcopy,也不想修改第 3 方代码。)
在 C++11 中,如果两种类型是布局兼容,这对于相同且具有标准布局的结构来说是正确的。请参阅此答案了解更多详细信息 https://stackoverflow.com/a/7762964/5696.
您还可以在以前版本的 C++ 中将两个结构体粘贴在同一个联合中,这对能够以相同的顺序为不同的结构类型访问相同的数据成员(数据成员的“公共初始序列”)提供了一些保证。
在这种情况下,是的,C 风格的强制转换是等效的,但是reinterpret_cast
可能更惯用。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)