2012-04-24 61 views
6

有沒有辦法在運行期間在目標c中爲枚舉賦值? 我有幾個枚舉,並希望每個枚舉具有一定的價值。 這些值可以從xml文件中讀取。有沒有辦法做到這一點?在運行時更改枚舉值?

回答

16

抱歉,系統@Binyamin是正確的,你不能枚舉做到這一點。出於這個原因,我通常在我的項目如下:

// in .h 
typedef int MyEnum; 

struct { 
    MyEnum value1; 
    MyEnum value2; 
    MyEnum value3; 
} MyEnumValues; 

// in .m 
__attribute__((constructor)) 
static void initMyEnum() 
{ 
    MyEnumValues.value1 = 10; 
    MyEnumValues.value2 = 75; 
    MyEnumValues.value3 = 46; 
} 

這也具有能夠通過數值迭代,這是不可能與正常枚舉的優點:

int count = sizeof(MyEnumValues)/sizeof(MyEnum); 
MyEnum *values = (MyEnum *) &MyEnumValues; 

for (int i = 0; i < count; i++) 
{ 
    printf("Value %i is: %i\n", i, values[i]); 
} 

總而言之,這是我在C中使用枚舉的首選方式。

+0

@ Richard ..請你解釋什麼是__attribute __((構造函數))..謝謝你的答案 – 2012-04-24 20:30:21

+1

@learningDroid它是一個GCC擴展,它允許你創建一個在目標加載之前被調用的函數(在dylib中,它將在dylib的第一個函數運行之前,在應用程序中,它在'main()'之前) 。一個非常有用的構造,只要你沒有沉重的舉動,你應該沒問題。 – 2012-04-24 20:32:47

+0

我打算讀取一個xml文件併爲結構體中的枚舉賦值。你認爲__attribute方法 – 2012-04-24 20:34:27

5

不,編譯時會刪除枚舉信息。

+4

不幸的是,這是事實。然而,如果你想持有這些信息,你可以使用結構而不是枚舉。 – 2012-04-24 20:16:27