大小为1的Typedef(匿名)结构数组

因此,最近我一直在为我正在进行的一个项目探索GMP的内部内容,我遇到了一个对我来说毫无意义的构造:(摘自6.2.1版的标题)

代码> /*以供参考,请注意,名称为MyMpZyStrut进入C++ Mulink
函数名,这意味着__&引用;建议一个内部的,我们
必须保留此名称以实现二进制兼容性*/
类型定义结构
{
int _mp_alloc;/*分配和指向的*肢体*数量
通过_mp_d字段执行*/
int _mp_size;/*abs(_mp_size)是肢体的数量
最后一个字段指向。如果_mp_size为
负数这是负数*/
mp_limb_t*_mp_d;/*指向肢体的指针*/
}_uu-mpz_结构;
#endif/*.\uuu GNU\u MP\uu*/
typedef_uumpz_struct MP_INT;/*gmp 1源兼容性*/
typedef uu mpz_struct mpz_t[1];

在这里的最后一行,我们键入defmpz\u t作为一个大小为1的数组,其中包含\uu mpz\u structs。这对我来说很奇怪,我以前从未见过这样的建筑。我知道这会导致mpz\u t有效地成为指向\uuu mpz\u结构的指针,但这是否等同于

typedef\uuumpz\ustruct*mpz\t;

有人能解释这背后的逻辑吗

给定typedef\uuumpz\ustruct mpz\ut[1],您可以使用mpz\t foo声明一个实际的mpz\t对象。这将为mpz\u t保留内存

相反,如果类型为typedef\uuumpz\ustruct*mpz\t,然后mpz\t foo只会给您一个指针。没有空间放置mpz\u t。你必须分配它,以后你必须释放它。因此需要更多的代码,这将是一个麻烦

同时,当一个mpz_t被传递给一个函数时,由于数组到指针的自动转换,只传递它的地址。这允许写入mpz_add(z,x,y),它比mpz添加(&z,&x,&y)更少混乱。程序员之间可能会有争论,当代码名义上看起来只是传递了一个值时,是否倾向于使用类型定义来有效地将对象的引用传递给函数,但这种风格可能更适合使用GMP进行编程的类型

发表评论