pr1*_*268 8 c arrays struct typedef gmp
我正在使用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];
Run Code Online (Sandbox Code Playgroud)
第一个问题:是否[1]
与__mpz_struct
?换句话说,typedef
将mpz_t
类型定义为__mpz_struct
具有一次出现的数组?
第二个问题:为什么阵列?(为什么只出现一次?)这是我听说过的结构黑客之一吗?
第三个问题(可能与第二个问题间接相关):mpz_init_set(mpz_t, unsigned long int)
函数的GMP文档说只使用它作为pass-by-value,尽管可以假设这个函数会在被调用函数中修改它的内容(因此需要pass-by-reference)语法.参考我的代码:
/* FROM MY CODE */
mpz_t fact_val; /* declaration */
mpz_init_set_ui(fact_val, 1); /* Initialize fact_val */
Run Code Online (Sandbox Code Playgroud)
单次出现数组是否允许自动传递引用(由于C中数组/指针语义的崩溃)?我很自然地承认我有点过分分析这个,但我当然喜欢对此进行任何讨论.谢谢!
从 C2 中描述的意义上讲,这似乎不是 struct hack。看起来他们想要mpz_t
拥有指针语义(大概是他们希望人们像使用不透明指针一样使用它)。考虑以下片段之间的语法差异:
struct __mpz_struct data[1];
(&data[0])->access = 1;
gmp_func(data, ...);
Run Code Online (Sandbox Code Playgroud)
和
mpz_t data;
data->access = 1;
gmp_func(data, ...);
Run Code Online (Sandbox Code Playgroud)
因为 C 数组衰减为指针,这也允许自动按引用传递mpz_t
类型。
它还允许你使用一个类指针类型,而无需malloc
或free
它。
*第一个问题:[1]
与__mpz_struct关联吗?换句话说,typedef 是否将 mpz_t 类型定义为仅出现一次的 __mpz_struct 数组?*
是的。
第二个问题:为什么是数组?(为什么只出现一次?)这是我听说过的结构黑客之一吗?
打败我。不知道,但一种可能性是作者想要创建一个自动通过引用传递的对象,或者“是”,可能是结构黑客。如果您曾经将mpz_t
对象视为结构的最后一个成员,那么“几乎可以肯定”这是结构黑客。分配看起来像
malloc(sizeof(struct whatever) + sizeof(mpz_t) * some_number)`
Run Code Online (Sandbox Code Playgroud)
这将是一个致命的赠品。
单次出现数组是否自动启用按引用传递...?
啊哈,你也猜出来了。“是”,一个可能的原因是以更复杂的引用为代价来简化引用传递。
我想另一种可能性是数据模型或算法发生了变化,作者想找到每个参考并以某种方式改变它。像这样的类型更改将使程序具有相同的基本类型,但会错误输出每个未转换的引用。