2012-02-02 33 views
7

我正在設計一個C API,其中包括提供一些方法來設置一些雙值選項。爲了確定我用下面列舉的選項:在C中的公共API函數中使用枚舉參數是一個好主意嗎?

typedef enum 
{ 
    OptionA, 
    OptionB, 
    ... 
} Option; 

它是在一個公共的API函數使用Option作爲參數類型是一個好主意:

int set_option(Option opt, double value); 

或者是它更好地使用int代替:

int set_option(int opt, double value); 

考慮到我將來可能需要添加更多選項?

也有沒有任何現有的API的例子可以證明這兩種方法?

回答

6

通過使用enum,您可以有效地幫助您的函數的用戶知道可用的有效值。 當然,缺點是每當添加新選項時,您都需要修改標題,因此用戶可能需要重新編譯他的代碼,而如果它是int,他可能不需要這樣做。

+0

要求用戶重新編譯他的代碼最讓我擔心。在第一種方法中添加新選項時(使用枚舉作爲參數)是否有辦法避免它? – vitaut 2012-02-02 20:27:57

+2

爲什麼要爲重新編譯添加新選項?舊的代碼仍然可以工作。如果你想訪問新功能,那麼要求重新編譯並不是不合理的。如果你使用int來代替,那麼你應該在頭文件中將它定義爲一個常量,以便在那裏重新編譯。 – 2012-02-02 20:34:21

+0

有人可能會提出一個相當明顯的觀點,即爲了*使用*新值,無論如何都必須更改並重新編譯該代碼。添加一個新的枚舉值不需要重新編譯任何現有的代碼。 – 2013-05-17 19:55:18

1

枚舉爲您提供編譯時檢查該值是否理智的優勢。然後,如果將來添加選項,則必須將新選項添加​​到新版本的頭文件。

+0

怎麼樣?當調用一個需要enum參數的函數時,C似乎很樂意接受任何整數。 (至少在XCode項目中默認啓用的任何警告。) – millimoose 2012-02-02 20:28:52

+2

您一定在考慮一些其他的語言。 C枚舉只是整數。根本沒有真正的類型安全。 – 2012-02-02 20:33:07

+1

我已經明確地看到,當int不屬於枚舉聲明範圍時,編譯器會在枚舉中傳入int時生成警告。也許編譯器只是一個可選的好東西來警告? – TJD 2012-02-02 21:31:52

相關問題