我在使用C++中的mpir库时遇到了问题。是否可以从函数中返回mpz_t值?当我尝试这样做时,出现以下错误:
RSA.cpp:50:36: error: ‘HASHtemp’ declared as function returning an array
mpz_t RSA::HASHtemp( mpz_t message )
mpz_t
被定义为数组类型:typedef __mpz_struct mpz_t[1];
函数不能返回数组。
这意味着你可以定义一个类型为mpz_t
的对象,然后将其作为参数传递给函数,允许函数修改其值(因为数组会衰减为指针)。
在评论中,你写道:
我不明白为什么文档中有被称为返回
mpz_t
的函数声明。
文档显示了一些宏,而不是实际的函数,例如mpq_numref
和mpq_numden
,它们被描述为返回mpz_t
值。实际上,它们都产生一个结果,其类型是mpz_t
数组的元素类型的指针(__mpz_struct*
)。该值可以传递给文档中记录为使用mpz_t
参数的函数,但实际上所有这样的函数都采用指针参数。
C和C++不允许数组类型的参数或返回数组值的函数,但它们有几个特性,让你编写代码看起来好像这是可能的。在大多数情况下,数组类型的表达式会转换为指针,并且数组类型的函数参数会被“调整”为指针参数。(就我个人而言,我不是特别喜欢GMP/MPIR利用这一点的方式。)
mpq_numref()
的结果被传递给了mpz_add()
。显然,它产生的不是一个mpz_t
,而是指向元素类型的指针--这就是mpz_add
所接受的参数。例如,你不能将mpq_numref
的结果赋值给一个mpz_t
对象。 - Keith Thompson
mpz_t
类型添加别名,或者关联class/struct/union/enum
,这样没有经验的人也可以很好地回答这个问题。仅供参考。 - cadaniluk