2

根据经验,以下工作(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 类,这是有效/最佳方法吗?

(题外话:对于那些想知道我为什么要这样做的人,我正在处理两个需要 128 位内存的 C 库,并使用具有不同内部名称的结构 - 很像我示例中的结构。我不想要 memcopy,也不想在 3rd 方代码中乱窜。)

4

1 回答 1

2

在 C++11 中,如果这两种类型是布局兼容的,这是完全允许的,这对于相同且具有标准布局的结构是正确的。有关更多详细信息,请参阅此答案

您还可以在以前版本的 C++ 中将两个结构粘贴在同一个联合中,这有一些保证能够以相同的顺序访问不同的结构类型的相同数据成员(数据成员的“公共初始序列”)。

在这种情况下,是的,C 风格的演员表是等价的,但reinterpret_cast可能更惯用。

于 2012-04-18T06:39:43.327 回答