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

C++ 遗留代码段中的可变长度结构,c++,struct,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]));} }; 我需要一

我最近一直在重新分解一些遗留代码,并遇到了这个问题

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]
有什么用

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


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

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

以下片段将打印
4,1

 #include <stdio.h>

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

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

已经纠正了代码中明显的错误

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

至于作者为什么写了这么愚蠢的东西,而不仅仅是 写
sizeof(B)
,你得问问他。我从来没见过 任何人都可以这样做。(如果他有,这可能是有道理的
写了
成员[0]
。但不是
B[1]

对不起。重命名了变量。您发布的内容没有有效的语法。确保你发布了一个可信的例子。你确定它不是
成员[1]
B
是一种类型,所以
B[1]
没有意义。^这正是我的问题。不确定它的意思。如果你剪切并粘贴实际代码可能会更好,你试图“简化”它会把事情搞得一团糟。首先,谢谢。在上面的代码片段中,您知道sizeof如何与B[1]一起使用吗?我认为sizeof应该由编译器实现,并且应该是宏。正确吗?“无论
B
定义为什么,它肯定是一个指针”:在他发布的代码中,它是一个
struct
。它不是未定义的行为,因为
B[1]
是一个类型表达式,一个
B
的数组[1]。即使在将对其进行评估的上下文中(例如,
new B[1]
),也不会有未定义的行为。