2011-09-22 60 views
4

我有一段代码是用C++编写的,需要用C语言编写。我转换了大部分代码,但我无法弄清楚如何将函数中的C++传递引用转换为C代码,即如何将使用C++ pass-by-reference的函数转换为C?

实施例:

int& a; 

它是在一些用作输入变量使用:

void do_something(float f, char ch, int& a) 

当我与CI GET编译器错误编译它。什么是正确的方式来取代C中的引用传递?

+3

改为使用指针。 – 2011-09-22 15:48:01

回答

9

在C做的方式是通过指针传递:在do_something使用,而不是

void do_something(float f, char ch, int& a) 
{ 
    a = 5; 
    printf("%d", a); 
} 

void do_something(float f, char ch, int* a) 

而且您现在需要提领a

void do_something(float f, char ch, int* a) 
{ 
    *a = 5; 
    printf("%d", *a); 
} 

而当拨打电话do_something时,您需要知道什么是被传递的,所以不是

int foo = 0; 
d_something(0.0, 'z', foo); 

你需要做的:

int foo = 0; 
d_something(0.0, 'z', &foo); 

得到(即指针)foo的地址。

1

因为引用不是在C语言中,你必须通过一个指针来代替:

void do_something(float f, char ch, int *a) 

然后在功能您必须取消对它的引用的身体,以获得或者修改所指向的值:

*a = 5; 

假设xint,你要调用的函数,使用&接线员给它的地址(将其转换为int *指针):

do_something(f, ch, &x) 
1

的最接近的是一个指针:

do_something(float f, char ch, int* a) 

已经做到了这一点,你需要改变a - >*a函数中无处不在,并改变调用函数传递&a代替的a

1

“易”,但不可取,方法是从一个辅助指针变量和使用#define
随意downvote这个答案得到帮助!我想,如果我可以:)

打开本

int foo(int &a) { 
    a = 42; 
    /* ... */ 
    return 0; 
} 

int foo(int *tmpa) {  /* & to *; rename argument */ 
    #define a (*tmpa)  /* define argument to old variable */ 
    a = 42;    /* no change */ 
    /* ... */    /* no change */ 
    return 0;    /* no change */ 
    #undef a    /* "undo" macro */ 
} 

注:引进的#define必须谨慎进行

+1

我不会建议有人使用这样的'#define',除非他很懒,或者不想记住'a'是一个指针。 –

+0

我实际上会赞成它,因为它很聪明并解释了这个概念,并且我们同意这是不明智的。 –

+1

创造性的答案,但它没有考虑调用约定中的变化(因为您需要更改调用此方法以使用&的代码)。我不会失望,但我不会喜欢,因为这不应该做。 –

1

有没有相当于C中的C++引用。 但是,您可以使用指针。然而,它们是具有自己地址的变量,而C++引用只是别名。

function do_something(float f, char ch, int* a) 
相关问题