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