我使用 GNU 多精度 (GMP) 库代码细读了一些使用任意长度整数的代码。 MP 整数的类型是在 gmp.h 头文件中定义的 mpz_t
。
但是,我对这个库定义的 mpz_t
类型的低级定义有一些疑问。在 header 代码中:
/* 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我听说过?
第三个问题(可能与第二个问题间接相关):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 中数组/指针语义的崩溃)?我承认我有点过度分析了这一点,但我当然喜欢对此进行任何讨论。谢谢!
最佳答案
这似乎不是 C2 中描述的结构黑客攻击。看起来他们希望 mpz_t
具有指针语义(大概,他们希望人们像使用不透明指针一样使用它)。考虑以下片段之间的句法差异:
struct __mpz_struct data[1];
(&data[0])->access = 1;
gmp_func(data, ...);
和
mpz_t data;
data->access = 1;
gmp_func(data, ...);
因为 C 数组退化为指针,这也允许通过引用自动传递 mpz_t
类型。
它还允许您使用类似指针的类型,而无需 malloc
或 free
它。
关于c - 关于typedef中单实例数组的一些问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4835112/