我注意到,在我們的代碼庫的幾個地方,我們使用動態擴展數組,即一個基本數組與一個元素計數器和一個「最大元素」值。一個好的C等效STL向量?
我想要做的就是用通用的數據結構和實用程序函數替換這些通用的面向對象的原因。 數組元素可以是基本數據類型或結構體,我需要對元素進行快速隨機訪問,最好是類型安全的實現。
所以,基本上,我想用是一個STL向量,但代碼庫被限制爲C89,所以我必須想出別的東西:-)
我給它一些思考和鞭打只是爲了展示我的目標:
/* Type-safe dynamic list in C89 */
#define list_declare(type) typedef struct _##type##_list_t { type * base_array; size_t elements; size_t max_size; } type##_list_t
#define list(type) type##_list_t
#define list_new(type, initial_size) { calloc(initial_size, sizeof(type)), 0, initial_size }
#define list_free(list) free(list.base_array)
#define list_set(list, place, element) if (list.elements < list.max_size) { list.base_array[place] = element; } else { /* Array index out of bounds */ }
#define list_add(list, element) if (list.elements < list.max_size) { list.base_array[list.elements++] = element; } else { /* Expand array then add */ }
#define list_get(list, n) list.base_array[n]
/* Sample usage: */
list_declare(int);
int main(void)
{
list(int) integers = list_new(int, 10);
printf("list[0] = %d\n", list_get(integers, 0));
list_add(integers, 4);
printf("list[0] = %d\n", list_get(integers, 0));
list_set(integers, 0, 3);
printf("list[0] = %d\n", list_get(integers, 0));
list_free(integers);
return EXIT_SUCCESS;
}
...但是,必須有其他人誰做了這個之前。我知道FreeBSD sys/queue.h對於一些不同隊列的類似概念的實現,但我找不到像這樣的陣列。
有沒有人在這裏任何明智?
最起碼,無論是擺脫了宏與函數替換它們,或修正他們,使他們像正常工作功能。後者涉及用'do {...} while(0)'包裝任何超過單個表達式/語句的宏。 – 2010-08-11 09:03:01
爲什麼我想要擺脫宏?用函數替換它們會打敗類型獨立性,它不再是一個通用的解決方案。另外,爲什麼我要包裝在一起做...而?這將導致不可能從函數式宏返回值。 – Christoffer 2010-08-11 10:12:17
@christoffer:重新閱讀R的評論。請注意使用「或」 - 這些函數宏很糟糕,您應該通過「固定」它們來改進它們,正如R所說。這使得使用函數宏不那麼令人驚訝。我個人更喜歡函數宏是否大寫,以便衡量。 – Arafangion 2010-08-11 23:13:40