c - 关于typedef中单实例数组的一些问题

标签 c arrays struct typedef gmp

我使用 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 类型。

它还允许您使用类似指针的类型,而无需 mallocfree 它。

关于c - 关于typedef中单实例数组的一些问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4835112/

相关文章:

c++ - popen 同时读写

c++ - 模板化类中带有模板对象的结构

c++ - 强制 C++ 结构紧密打包

c - Sizeof 运算符返回不正确的大小?

C 多线程字数统计

c - 函数声明的生产规则中 yytext 的意外值

c - 使用 openssl evp api(aes256cbc) 加密文件的问题

php - 将数组设置为 foreach 后无法计数?

c - do while 的奇怪行为

javascript - javascript "break"会完全停止递归函数还是只是停止该实例?