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
ますか? つまり、型を 1 回出現する配列としてtypedef
定義しているのでしょうか。mpz_t
__mpz_struct
2 番目の質問: なぜ配列なのか? (そして、なぜ 1 回しか発生しないのですか?) これは私が聞いた構造体ハックの 1 つですか?
3 番目の質問 (おそらく 2 番目の質問に間接的に関連している):mpz_init_set(mpz_t, unsigned long int)
関数の GMP ドキュメントでは、値渡しのみとして使用するように指示されていますが、この関数は呼び出された関数内の内容を変更していると想定されます (したがって、参照渡し) 構文。私のコードを参照してください:
/* FROM MY CODE */
mpz_t fact_val; /* declaration */
mpz_init_set_ui(fact_val, 1); /* Initialize fact_val */
単一出現配列は、参照渡しを自動的に有効にしますか (C の配列/ポインターのセマンティクスが壊れているため)? 私はこれを少し分析しすぎていることを率直に認めますが、これについての議論が大好きです. ありがとう!