Ç枚舉是整數。該語言只是提供了一些語法來進行int替換(以及編譯器可以執行的其他一些項目)。
如果你想要一個類似枚舉的Java,你需要創建一堆全局對象。由於C缺乏Java枚舉合同的強制執行,您需要儘可能實現它們。
因此,這在兩個方面使事情複雜化。現在你需要模擬一個對象並模擬枚舉(如果你想在c中使用類似Java的枚舉)。
對於模擬一個對象,有一些技術很好。關鍵是要及早戒菸只實現你需要的功能,因爲你添加更多的功能,就越難是:
typedef struct tag_result {
int enum_value;
char* enum_name;
} result;
result* getEnumByValue(int index);
result* getEnumByName(char* name);
,並在.c
文件
// resize to match entries
int enum_limit = 5;
result enums[enum_limit];
// it is your responsibility to not duplicate values.
enums[0].enum_value = 0;
enums[0].enum_name = "invalid_argument";
enums[1].enum_value = 1;
enums[1].enum_name = "no_memory";
result* getEnumByName(char* name) {
int index;
for (index = 0; index < enum_limit; index++) {
if (strcmp(enums[index].enum_name, name)) {
return enums[index];
}
}
return 0;
}
result* getEnumByValue(int value) {
int index;
for (index = 0; index < enum_limit; index++) {
if (enums[index].enum_value == value) {
return enums[index];
}
}
return 0;
}
現在,如果你想封裝,你可以將結構分成兩部分,一部分暴露,一部分隱藏。第一種技術是隻公開typedef struct s_result result
,讓結構的佈局在.h
中定義。起初有點棘手,但它保證沒有任何內容暴露在內,並提供了.c
文件的完全訪問權限。如果你使用這種技術,你需要添加訪問器方法。
int getResultValue(result* item) {
return (*item).enum_value;
}
char* getResultName(result* item) {
return (*item).enum_name;
}
有些人進一步分析,有一個「公共」和「私人」的標題。一個結構指向另一個結構(由void *指針隱藏)。這個想法是通過不公開「私有」頭指針的類型來隱藏數據。自然地位縫合在一起,您需要了解在佈線構造,
result* new_resultEnum(int value, char* name) {
result* newItem = (result*)malloc(sizeof(struct s_result));
(*newItem).private = (p_result*)malloc(sizeof(struct s_p_result));
(*newItem).private.enum_value = value;
(*newItem).private.enum_name = name;
return newItem;
}
利用這樣的技術,可以很容易地通過C的函數指針添加構件的方法(雖然語法是一個挑戰)。
... added to the constructor above ...
(*newItem).getValue = result_getValue;
公開暴露「getValue」方法。有一個警告。在C中傳遞「this」指針並不是一個好方法,因爲成員函數缺乏「知道」它們在結構中的能力,並且「知道」該結構在哪裏開始。是的,有解決方法,但他們開始花費更多的時間和金錢。我通常只是不打擾,這使得這樣的代碼很常見。
result* myresult;
(*myresult).getValue(myresult);
雖然我希望你喜歡錶面更深的劃痕,但你應該比成員函數更早停下來。也許我應該早早停止比polymorphisim的實現更快:)
你爲什麼不簡單地嘗試它? – Maroun
這是[Oracle Enum教程](http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html) –
爲什麼downvotes?嘗試它是不夠的。許多C程序似乎都能工作,但實際上依賴於未指定的,未定義的或實現定義的行爲。 – pburka