Cũng có một phương pháp khác trong C99, đặc biệt nếu bạn muốn các chỉ mục có tên, cho phép bản địa hóa ví dụ và như vậy.
enum STRINGS {
STR_THING1,
STR_THING2,
STR_THING3,
STR_THING4,
STR_WHATEVER,
STR_MAX /* Always put this one at the end, as the counting starts at 0 */
/* this one will be defined as the number of elements */
}
static const char *foo[STR_MAX] = {
[STR_THING1] = "123",
[STR_THING2] = "456",
[STR_THING3] = "789",
[STR_THING4] = "987",
[STR_WHATEVER] = "OR Something else",
};
Bằng cách sử dụng trình khởi tạo tên chương trình vẫn chính xác ngay cả khi giá trị enum thay đổi.
for (i = STR_THING1; i<STR_MAX; i++)
puts(foo[i]);
hoặc bất cứ nơi nào trong chương trình với chỉ số tên
printf("thing2 is %s\n", foo[STR_THING3]);
Kỹ thuật này có thể được sử dụng để mô phỏng bó ressource. Khai báo một enum
và một số mảng chuỗi với các biến thể ngôn ngữ và sử dụng một con trỏ trong phần còn lại của chương trình. Đơn giản và nhanh chóng (đặc biệt là trên các máy 64bit nơi nhận được địa chỉ của một hằng số (string) có thể tương đối tốn kém Edit:.. Sizeof foo/sizeof * Kỹ thuật foo vẫn hoạt động với điều này
Nguồn
2010-06-20 17:58:55
sẽ này vẫn hoạt động nếu con trỏ nhân vật trong foo chỉ vào chuỗi ký tự của kích thước biến? – randombits
yes (15 char hạn) –
vì vậy nếu bất kỳ yếu tố vượt quá 15 ký tự, việc kiểm tra này sẽ thất bại? lẽ tốt hơn để sử dụng NULL sentinel sau đó? cảm ơn một lần nữa – randombits