在xdn-project/digitalnote ./src/crypto/crypto.cpp
文件中,编译时第338行出现错误(使用cmake):
return sizeof(rs_comm) + pubs_count * sizeof(rs_comm().ab[0]);
^
错误:不完整类型的值初始化 '加密:: rs_comm :: []'
我在cryptonotefoundation/cryptonote找到了解决方案:
return sizeof(rs_comm) + pubs_count * sizeof(((rs_comm*)0)->ab[0]);
我可以很好地使用Java JDK,但目前在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]);
}
答案 0 :(得分:1)
sizeof是一个返回特定类型大小的运算符。它可以直接使用类型或表达式。
这部分(rs_comm *)0取0(0是有效的空指针常量)并将其转换为struct rs_comm的指针(或类,我不知道rs_comm的定义,但是我猜。)
现在,它正在使用 - >进行访问操作员到数据成员ab。 ab必须定义为数组,因此它可以获取数组中的第一项。
因为,sizeof并没有真正评估表达式,只是弄清楚它的类型并获得它的大小。
因此,最终结果是类/ struct rs_comm的数组ab中第一个元素的大小。
答案 1 :(得分:1)
所以ab
是struct rs_comm
的成员,是一个数组。
如果你有一个 rs_comm对象,即rs_comm rs;
,但你不知道ab
的类型,你想知道它的大小,{{ 1}}会做的。
如果您有指向rs_comm的指针,即sizeof(rs.ab[0])
,那么rs_comm *p_rs;
将执行相同的操作。
如果您没有 rs_comm对象或指向rs_comm 的指针,则可以将一个空指针更改为指向rs_comm 的指针,这是sizeof(p_rs->ab[0])
所做的。
将((rs_comm *)0)
中的p_rs
替换为sizeof(p_rs->ab[0])
,获得((rs_comm *)0)
。
答案 2 :(得分:0)
sizeof(变量)。 返回size变量数据类型。 喜欢 char x; cout<< sizeof(x); 结果将是