您可以初始化GMP变量' mpz_t n'如mpz_init(n)。
文档sais ' void mpz_inits(mpz_t x,...)初始化以NULL结尾的mpz_t变量列表,并将其值设置为0.'
我不确定' NULL终止列表'这意味着。
mpz_t a, b, c;
mpz_inits(a, b, c, NULL);
以上是初始化a,b和c的正确方法吗?
答案 0 :(得分:8)
是的,这是正确的。
在C中,对于可变参数函数(例如mpz_inits
)没有隐式的方法来知道传递了多少个参数。不同的功能以不同的方式实现。例如,*printf
系列使用格式字符串来确定额外参数的数量/类型。在其他情况下,例如mpz_inits
,它们使用NULL终止符来标记列表的结尾(与空字符\0
标记字符串结尾的方式非常相似)。
NULL终止只是意味着其他不确定长度的列表的结尾用NULL
参数表示。
答案 1 :(得分:2)
在C中,当原型以省略号结尾时,不能检查相应参数的类型。因此,您需要确保最后一个参数的类型是正确的。这里,由于mpz_inits
需要指向mpz_ptr
的指针,因此需要提供指向此类型的空指针,例如通过使用演员:
mpz_inits (a, b, c, (mpz_ptr) 0);
或
mpz_inits (a, b, c, (mpz_ptr) NULL);
请注意,转换为另一种指针类型(如void *
)并不能保证在所有平台上都能正常工作,特别是在指针类型的大小不同的情况下。现在,这些平台是否存在/ GMP是否支持此类平台是另一个问题......但其他问题也可能来自高级编译器优化。因此,最好严格遵循C标准。