2011-09-22 24 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)