初始化变量

时间:2016-03-07 19:48:04

标签: c initialization

可能在C中做这样的事情吗?

typedef XXX bar;
void foo(bar i) {
    ...
}
main() {
    bar a;
    foo(a); // note!!, this is not foo(&a)
    // a is now initialized
}

请注意,foo是一个void函数,否则返回一个新栏可以轻松解决问题。此外,即使bar是一个指针,或指针的指针,例如typedef int ** bar,我也不知道foo如何初始化a

我提出了自己的问题,因为我相信GMP他们做了类似的事情。所以在GMP中你可以拥有:

mpz_t a; 
mpz_init2(a); 
// a is now initialized

3 个答案:

答案 0 :(得分:3)

来自http://gnu.huihoo.org/gmp-3.1.1/html_chapter/gmp_4.html

  

mpz_t实际上是作为某个元素的单元素数组实现的   结构类型。这就是使用它来声明一个变量的原因   具有GMP需要的字段的对象,但随后将其用作参数   传递指向对象的指针。

答案 1 :(得分:2)

可以使用函数中的指针参数和参数列表中的address-of运算符在C中实现引用语义:

void init(int * dst, int value) { *dst = value; }
//       ^^^^^^
//       function takes parameter by address, passed as a pointer

int main()
{
    int a;
    init(&a, 10);
    //   ^^
    //   caller passes address-of object
}

如果您想要一个词法上省略了address-of运算符的语法,您可以将该部分粘贴到宏中:

#define INIT_BY_REF(x, val) init_ref(&(x), val)

现在使用:init_ref(a, 10)

答案 2 :(得分:0)

只有初始化的变量是指针或(typedef'd)数组才有可能。我没有GMP经验,但初始化函数向我表明mpz_t是指针或数组的typedef。

如果传递的参数是原始值或结构值,则该函数将使用其自己的数据副本,并保持传递给它的变量不受影响。