2012-04-24 29 views
6

Có cách nào gán giá trị cho enums trong thời gian chạy trong mục tiêu c không? Tôi có một số enums và muốn mỗi enum có giá trị nhất định. Các giá trị có thể được đọc từ một tệp xml. Có cách nào để làm việc này không?Thay đổi giá trị enum khi đang chạy?

Trả lời

16

Unfortunatley, @Binyamin là chính xác, bạn không thể thực hiện điều này bằng enum. Vì lý do này, tôi thường làm như sau trong các dự án của tôi:

// 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; 
} 

này cũng có lợi thế của việc có thể để lặp qua các giá trị, đó là không thể với một enum bình thường:

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]); 
} 

Tất cả trong tất cả, đây là cách ưa thích của tôi để làm enums trong C.

+0

@ Richard .. bạn có thể giải thích __attribute __ ((constructor)) là gì .. cảm ơn bạn đã trả lời mặc dù –

+1

@learningDroid đó là một Phần mở rộng GCC, cho phép bạn tạo ra một hàm được gọi ngay trước khi tải đích (trong một dylib, nó sẽ là trước khi hàm đầu tiên từ dylib được chạy, trong một ứng dụng, nó nằm ngay trước 'main()') . Một cấu trúc rất hữu ích, và miễn là bạn không nâng vật nặng trong đó, bạn sẽ ổn thôi. –

+0

Tôi đang lập kế hoạch để đọc một tập tin xml và gán giá trị cho enums trong một cấu trúc. Bạn có nghĩ rằng điều này sẽ quá nặng trong phương pháp __attribute –

5

Không, thông tin enums bị xóa tại thời gian biên dịch.

+4

Thật không may đây là trường hợp. Tuy nhiên bạn có thể sử dụng cấu trúc thay vì một enum nếu bạn muốn giữ thông tin .. –

Các vấn đề liên quan