Некоторые вопросы о массиве с одним экземпляром в typedef

Я просматривал некоторый код, использующий целые числа произвольной длины, используя код библиотеки 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)? Я открыто признаю, что немного переоцениваю это, но я определенно хотел бы обсудить это. Спасибо!

8
задан pr1268 29 January 2011 в 04:14
поделиться