2010-09-24 204 views
1

我正在爲C編寫一個Unicode庫作爲個人練習。如果沒有實際的代碼,我有這樣的:自動傳遞參數在C參考

typedef struct string { 
    unsigned long length; 
    unsigned *data; 
} string; 

// really simple stuff 

string *upush(string *s, unsigned c) { ... } 

// UTF-8 conversion 

string *ctou(char *old) { ... } 

char *utoc(string *old) { ... } 

upush推動全Unicode代碼點c到的s末,根據需要重新分配。

我可以使用類這樣的,例如:

string a; 
upush(&a, 0x44); 
puts(utoc(&a)); 

而不必使用&到參考傳遞給函數的,有一種方法可以寫出這樣我可以撥打:

string a; 
upush(a, 0x44); 
puts(utoc(a)); 

或者,你認爲這只是最好的typedef stringstruct string指針,而不是結構本身,始終與struct string指針處理?

解決方法?由於Dummy00001,這是我現在的圖書館的一般輪廓:

typedef struct string { 
    unsigned long length; 
    unsigned *data; 
} string; 

// really simple stuff 

string *upush(string *s, unsigned c) { ... } 

// UTF-8 conversions 

string ctou(char *old) { ... } 

char *utoc(string old) { ... } 

下面是一些例子:++

string a = ctou("Hello, world"); 
upush(&a, '!'); 
puts(utoc(a)); 

我也學習,感謝Doches,在C(這是我會寫這個庫中的包裝),你可以寫原型這樣做隱含傳遞按引用:

string *upush(string &s, unsigned c); 

對於那些有興趣誰,這是我不斷取得的進展:http://delan.ath.cx/ulib

+0

好運氣的運動,unicode是非常困難的得到正確。 – 2010-09-24 09:46:25

+0

助手宏怎麼樣? #define upush(a,b)upush(&a,b) – Nyan 2010-09-24 10:04:52

+0

呃,這似乎有點'hackish'。 – 2010-09-24 10:11:13

回答

3

而不必使用&到參考傳遞給函數的,有一種方法可以寫出這樣我可以撥打:
字符串;
upush(a,0x44);
puts(utoc(a));

我個人比較喜歡&符號並使用它(即使在C++)這可能修改它的參數和功能訪問所述結構作爲一個const的情況下的功能的情況下之間進行區分。 IOW:

string a; 
upush(&a, 0x44); // pass pointer, we modify the "a" 
puts(utoc(a)); // pass "a" as a copy, utoc() doesn't modify it 

在代碼上方的一個立即看到該upush()需要&a和因此潛在修改它。而utoc()採取a並且不修改它。

但最終決定如何使界面在很大程度上取決於你如何管理內存。

或者,你認爲將字符串作爲結構字符串指針,而不是結構本身,並且總是處理結構字符串指針會更好嗎?

使符號string成爲指向不透明結構的指針,僅在庫本身內定義。在公共接口頭:

struct string_s; 
typedef struct string_s *string; 

在內部報頭:

struct string_s { 
    unsigned long length; 
    unsigned *data; 
}; 

接口功能將僅接受string這是指針。提供函數來創建新字符串(calloc(1,sizeof(string *)))並銷燬它(free())。通過這種方式,您可以爲應用程序提供一致的接口(開發人員不必考慮什麼是指針),並且對庫內部更改也是有彈性的(因爲結構的結構只在庫本身內部知道)。

缺點是需要使用動態內存管理來分配puny結構:malloc()/free()速度很快,但它仍然像一次矯枉過正。

+0

通過使用可變大小的結構體語法,可以避免使庫執行的堆分配數加倍。但是,只要其大小發生變化,這會改變'string'結構的位置。像'upush()'這樣的函數要麼必須返回新的字符串,要麼使用額外的間接級別(例如'upush(string ** s,unsigned c)')。 – bk1e 2010-09-24 14:56:50

1

string a在當前範圍內分配你需要的內存,string *a只是一個指向內存的指針,你必須自己去malloc和free。

所以答案:取決於。如果您使用指針策略,則應該提供創建函數和銷燬函數,並記住用戶「忘記」使用這些函數。

+0

我想最好是堅持最初的範式。我將如何編寫隱式通過引用?沒有這個,我必須用'&'在字符串參數上進行所有的調用,而且看起來很笨重。 – 2010-09-24 09:46:25

+0

但是這是在C中執行此操作的正常方法。 – 2010-09-24 15:13:56

2

不幸的是,你給出的例子是在C中做引用傳遞的正確方法。我認爲你所追求的是用於指定參數應該通過引用而不是值傳遞的&表示法,是一個C++ - ism(Longer, better example from IBM)。

在C++(不是C!),你可以這樣寫:

typedef struct _foo_t { 
    int value; 
} foo; 

void modify_foo(foo &f) 
{ 
    f.value = -1; 
} 

和你要問什麼,如:

foo aFoo; 
aFoo.value = 1; 
modify_foo(aFoo); 
printf("%d\n",aFoo.value);