Я просматривал некоторый код, использующий целые числа произвольной длины, используя код библиотеки GNU Multi-Precision (GMP). Типом целого числа MP является mpz_t
, как определено в заголовочном файле gmp.h.
Но у меня есть несколько вопросов по поводу определения нижнего уровня этого определяемого библиотекой mpz_t
] тип. В коде заголовка:
/* THIS IS FROM THE GNU MP LIBRARY gmp.h HEADER FILE */
typedef struct
{
/* SOME OTHER STUFF HERE */
} __mpz_struct;
typedef __mpz_struct mpz_t[1];
Первый вопрос: связан ли [1]
с __ mpz_struct
? Другими словами, typedef
, определяющий тип mpz_t
как массив __ mpz_struct
с одним вхождением?
Второй вопрос: почему именно массив? (И почему только один случай?) Это один из тех struct hacks , о которых я слышал?
Третий вопрос (возможно, косвенно связанный со вторым вопросом): документация GMP для mpz_init_set (mpz_t, unsigned long int)
функция говорит использовать ее только как передачу по значению, хотя можно предположить , что эта функция будет изменять свое содержимое в вызываемой функции (и, следовательно, потребуется передача по ссылке) синтаксис. См. Мой код:
/* FROM MY CODE */
mpz_t fact_val; /* declaration */
mpz_init_set_ui(fact_val, 1); /* Initialize fact_val */
Включает ли однократный массив автоматическую передачу по ссылке (из-за нарушения семантики массива / указателя в C)? Я открыто признаю, что немного переоцениваю это, но я определенно хотел бы обсудить это. Спасибо!