我想要做的是用常见的数据结构和实用程序函数来代替这些数组,出于通常的面向对象编程的原因。数组元素可以是基本数据类型或结构体,我需要快速随机访问元素,并希望实现类型安全。
所以,基本上我想使用的是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)
包装任何超过一个表达式/语句的宏。 - R.. GitHub STOP HELPING ICE