Abi*_*her 6 c typedef gmp ruby-c-extension
我遇到了这段代码.
typedef __mpz_struct MP_INT;
typedef __mpz_struct mpz_t[1];
Run Code Online (Sandbox Code Playgroud)
这里的struct __mpz_struct是一个结构,它被定义为单个元素的数组.我理解这是一个通过C中的引用传递的技巧.然后mpz_t被用作声明变量的类型并将它们作为参数传递.此外,还有一个评论
/*
MP_INT*, MP_RAT* and MP_FLOAT* are used because they don't have side-effects
of single-element arrays mp*_t
*/
Run Code Online (Sandbox Code Playgroud)
他们在谈论什么样的副作用?
将数组传递给函数让数组衰减为指向其第一个元素的指针。
通过将 Address-Of 运算符应用于&与数组元素类型相同的简单变量,可以达到相同的效果。
例子:
struct S
{
int i;
float f;
};
Run Code Online (Sandbox Code Playgroud)
这
void set_S(struct S * ps)
{
ps->i = 40;
ps->f = 2.;
}
Run Code Online (Sandbox Code Playgroud)
相当于
void set_S(struct S ps[1])
{
ps->i = 40;
ps->f = 2.;
}
Run Code Online (Sandbox Code Playgroud)
相当于
void set_S(struct S * ps)
{
ps[0].i = 40;
ps[0].f = 2.;
}
Run Code Online (Sandbox Code Playgroud)
相当于
void set_S(struct S ps[1])
{
ps[0].i = 40;
ps[0].f = 2.;
}
Run Code Online (Sandbox Code Playgroud)
一元素数组方法:
typedef struct S Array_of_S_with_size_1[1];
int main(void)
{
Array_of_S_with_size_1 array_of_S_with_size_1;
array_of_S_with_size_1[0].i = 0;
array_of_S_with_size_1[0].f = 0.;
set_S(array_of_S_with_size_1);
...
}
Run Code Online (Sandbox Code Playgroud)
上面main()提供了与以下相同的功能:
int main(void)
{
struct S s;
s.i = 0;
s.f = 0.;
set_S(&s);
...
}
Run Code Online (Sandbox Code Playgroud)
我没有看到使用“单元素数组”方法有任何收获。预期可能是&键盘上的 - 键损坏......;-)