遗留代码段中的可变长度结构

时间:2013-12-24 10:42:54

标签: c++ struct

我最近一直在考虑一些遗留代码并遇到了这个

struct A
{
    struct B
    {
     ...
    };
    B member[0]; // Well known struct hack. Don't require any help here

   static int32_t Size(uint32_t count) return { (int32_t)(sizeof( A ) + count * sizeof( B[1]));}
};

我需要一些帮助来理解Size()方法。

为什么不使用size( A ) + count * size( B ) ??

B[1]有什么用?

我不明白为什么这个问题被投了票。 链接到正在运行的代码。

http://codepad.org/aGhQatEN

2 个答案:

答案 0 :(得分:1)

无论B被定义为什么,它肯定是一个指针。

sizeof(B)将返回指针的大小,而sizeof(B[1])将返回定义为B的元素类型的大小。

以下片段将打印4,1

 #include <stdio.h>

 int main(int arg, char *argv[])
 {
   char *B;
   printf("%d,%d\n",sizeof(B),sizeof(B[1])); 
 }

请注意,引用B[1]并不是未定义的行为,因为sizeof()在预处理时有效。

答案 1 :(得分:0)

纠正了代码中明显的拼写错误......

sizeof的操作数可以是表达式,也可以是类型 (必须在括号中)。在您的情况下,B是一种类型,所以 B[1]也是一种类型:1 B的数组。

至于为什么作者写了一些如此愚蠢的东西,而不仅仅是 写sizeof(B),你必须问他。我从来没见过 任何人都这样做。 (如果他有的话可能会有意义 写member[0]。但不是B[1]。)