2012-06-30 24 views
2

失敗我有一系列C函數:Ç方式來指示功能

const char* find_string(uint8_t id); 
int32_t find_int32(uint8_t id); 
uint32_t find_uint32(uint8_t id); 
uint64_t find_uint64(uint8_t id); 

它會返回找到的項目(在鏈接列表)。對於字符串,我可以返回一個空字符串。但對於整數值,我想指出是否找到積分值。什麼是C語言的方式來做到這一點?

喜歡這個:?

uint32_t find_uint32(uint8_t id, int* success); 
+3

@pyCthon:** C ** ... –

+0

@JeffMercado好點 – pyCthon

+0

@pyCthon:C語言缺少C++和Java等語言的異常工具。 –

回答

9

有沒有一個做到這一點的方式,但典型的解決方案是這樣的:

int find_uint32(uint8_t id, uint32_t *result) 

讓函數返回狀態碼而不是結果。實際結果是通過指針「返回」的。儘管意見分歧在這裏,它可能是對失敗的函數返回零個好主意,這樣就可以做這樣的事情:

if (!find_uint32(42, &out)) { 
    /* error */ 
} 

一個原因,將它倒過來,即返回狀態通過指針參數進行編碼,並將結果作爲函數的返回值,如果要忽略錯誤,則可以允許將NULL傳遞到狀態碼。這樣,如果您出於某種原因不必擔心錯誤,那麼您的代碼將更具可讀性;考慮:

uint32_t val = find_uint32(42, NULL /* don't care */); 

在某些情況下,你可以預約「魔值」爲錯誤指示。正如你所提到的,NULL指針適用於字符串。如果您確定某個整數值永遠不是有效結果,則可以讓它指示錯誤。例如,如果函數返回的值爲,則無符號的值永遠不會超過0x7FFFFFFF,您可以讓第31位指示錯誤,其餘31位保留數據或錯誤代碼,具體取決於最高位的值。

我通常會不鼓勵這種做法,理由是魔法錯誤數字會使代碼難以閱讀和維護,而不是顯式返回錯誤標誌。

+0

但是,然後調用者失去了一個簡單的調用find_uint32(tofind)的方便 - 但隨後將不得不通過錯誤指示器作爲參數,所以我猜它是擺動和迴旋。 –

+1

絕對如此。最後,它涉及到如何使用該功能。 –

1

什麼:

int find_uint32(uint8_t id, uint32_t *val); 

你一個指針傳遞給結果和錯誤返回0成功和!= 0

如果您喜歡在表達式中使用find_uint32的便利性,還可以返回指向元素的指針(或指向該節點的鏈接列表)。您需要取消引用指針來訪問值,但那麼你也可以使用NULL結果中的指針指示錯誤:

uint32_t *find_uint32(uint8_t id);