正如其他人提到的那样,您需要演员表,但您可以在宏或函数中隐藏丑陋。但是,要记住的另一件事是对齐要求。在大多数处理器上,您不能简单地将指向类型的指针增加任意数量的字节并将结果转换回指向原始类型的指针,而不会由于未对齐而通过新指针访问结构时出现问题。
x86 架构是少数几个可以让您摆脱它的架构之一(即使它是最流行的)。然而,即使你是为 Windows 编写的,你也需要考虑这个问题——Win64 确实强制了对齐要求。
因此,即使partitionMapLength
通过指针访问成员也可能会使您的程序崩溃。
__unaligned
您可能可以使用Windows 上的编译器扩展轻松解决此问题:
PartitionMap __unaliged *pm(reinterpret_cast<PartitionMap *>(partitionMaps));
for ( ; index > 0 ; --index)
{
pm = (PartitionMap __unaligned *)(((char *)pm) + pm->partitionMapLength);
}
return pm;
或者您可以将可能未对齐的数据复制到正确对齐的结构中:
PartitionMap *pm(reinterpret_cast<PartitionMap *>(partitionMaps));
char* p = reinterpret_cast<char*>( pm);
ParititionMap tmpMap;
for ( ; index > 0 ; --index)
{
p += pm->partitionMapLength;
memcpy( &tmpMap, p, sizeof( newMap));
pm = &tmpMap;
}
// you may need a more spohisticated copy to return something useful
size_t siz = pm->partitionMapLength;
pm = reinterpret_cast<PartitionMap*>( malloc( siz));
if (pm) {
memcpy( pm, p, siz);
}
return pm;