在xdn-项目/数字笔记 ./src/crypto/crypto.cpp文件中,编译(使用cmake)时在第338行有一个错误:
return sizeof(rs_comm) + pubs_count * sizeof(rs_comm().ab[0]);
^错误:值-不完全类型“Crypto::rs_comm::[]”的初始化
我在密码基础/密码上找到了解决方案
return sizeof(rs_comm) + pubs_count * sizeof(((rs_comm*)0)->ab[0]);我可以很好地使用Java,但目前在C++需要帮助:)很高兴看到这个代码部分的详细说明:
sizeof(((rs_comm*)0)->ab[0]);我的问题是:
rs_comm后面的星号-它是干什么用的?0) - 0在这里的目的是什么?代码片段:
struct rs_comm {
Hash h;
struct {
EllipticCurvePoint a, b;
} ab[];
};
static inline size_t rs_comm_size(size_t pubs_count) {
return sizeof(rs_comm) + pubs_count * sizeof(rs_comm().ab[0]);
}发布于 2018-03-28 15:24:38
大面积是返回特定类型大小的运算符。它可以直接处理类型或表达式。
这一部分(rs_comm*)0接受0 (0是一个有效的空指针常量),并将其转换为结构rs_comm的指针(或者类,我不知道rs_comm的定义,但我猜是这样)。
现在,它正在使用->操作符访问数据成员ab.ab必须定义为数组,因此它可以获得数组中的第一个项。
因为,size of并不能真正计算表达式,而只是计算出类型并得到它的大小。
因此,最后的结果是类/struct rs_comm数组ab中第一个元素的大小。
发布于 2018-03-28 15:26:01
因此,ab是struct rs_comm的成员,也是一个数组。
如果您有一个rs_comm对象,即rs_comm rs;,但是您不知道ab的类型,那么您想知道它的大小,sizeof(rs.ab[0])就可以了。
如果您有指向rs_comm的指针,即rs_comm *p_rs;,那么sizeof(p_rs->ab[0])将做同样的事情。
如果您没有rs_comm对象或指向rs_comm的指针,则可以将(空指针)更改为指向rs_comm的指针(),这是((rs_comm *)0)所做的。
将sizeof(p_rs->ab[0])中的sizeof(p_rs->ab[0])替换为((rs_comm *)0),则得到sizeof(((rs_comm *)0)->ab[0])。
发布于 2018-03-28 17:53:14
大小(变量)返回大小变量数据类型。就像char x;cout << sizeof(x)一样;结果将是
https://stackoverflow.com/questions/49538025
复制相似问题