GMP:初始化多个变量

时间:2014-08-06 14:12:56

标签: c gmp

您可以初始化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的正确方法吗?

2 个答案:

答案 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标准。