例如,我想做这样的事情:
#include <gmp.h>
typedef mpz_t Integer;
//
Integer F(Integer a,Integer b,Integer c,Integer d) {
Integer ret = times(plus(a,b),plus(c,d));
}
但是,GMP 不允许我这样做,显然 mpz_t 是一个数组,所以我收到错误:
error: ‘F’ declared as function returning an array
所以我必须做这样的事情:
void F(Integer ret,Integer a,Integer b,Integer c,Integer d) {
Integer tmp1,tmp2;
plus(tmp1,a,b);
plus(tmp2,c,d);
times(ret,tmp1,tmp2);
}
这是不自然的,并且不遵循 C(或一般数学)表达式的逻辑组成方式。事实上,您无法以类似数学的方式编写任何内容,因为显然您无法返回 GMP 数字!例如,如果我想编写一个简单的 yacc/bison 风格解析器,将使用 +、-、/、* 等的简单语法转换为使用 GMP 实现给定表达式的 C 代码,那么这似乎会困难得多,因为我必须跟踪所有中间值。
那么,我怎样才能在这里迫使 GMP 屈服于我的意志并接受更合理的语法呢?我可以安全地“作弊”并将 mpz_t 转换为 void *,然后在另一端将其重新构造回 mpz_t 吗?我通过阅读文档假设它不是really传递一个数组,但只是一个引用,那么为什么它不能也返回一个引用呢?是否有一些良好的编程基础可以以这种方式进行,我在编写自己的程序时应该考虑?