Here is my type safe dynamic array. I'm eventually going to make a hash table in C. I'm just wondering if anything seems wrong or out of place. Thanks.
#ifndef DARRAY_HEADER_INCLUDED
#define DARRAY_HEADER_INCLUDED
#include <stdlib.h>
#include <assert.h>
#include <string.h>
#define darray_deff(name, type)\
struct name {\
size_t capacity;\
size_t size;\
type *data;\
};\
void name##_grow(struct name *const _array, size_t const _capacity);\
void name##_reserve(struct name *const _array, size_t const _capacity);\
void name##_destroy(struct name *const _array);\
void name##_push(struct name *const _array, type const _value);\
void name##_push_unintialized(struct name *const _array, size_t const _amount);\
void name##_pop(struct name *const _array);\
type *name##_begin(struct name *const _array);\
type *name##_end(struct name *const _array);\
void name##_clear(struct name *const _array);\
int name##_empty(struct name *const _array);\
void name##_zero(struct name *const _array);\
\
void name##_grow(struct name *const _array, size_t const _capacity) {\
type *data = realloc(_array->data, _capacity * sizeof(type));\
assert(data);\
_array->data = data;\
_array->capacity = _capacity;\
}\
void name##_reserve(struct name *const _array, size_t const _capacity) {\
if(_capacity > _array->capacity) {\
name##_grow(_array, _capacity);\
}\
}\
void name##_destroy(struct name *const _array) {\
free(_array->data);\
_array->capacity = 0;\
_array->size = 0;\
}\
void name##_push(struct name *const _array, type const _value) {\
if(_array->size == _array->capacity) {\
size_t const capacity = (_array->capacity ? _array->capacity : 1);\
name##_grow(_array, capacity * 2);\
}\
_array->data[_array->size] = _value;\
++_array->size;\
}\
void name##_push_unintialized(struct name *const _array, size_t const _amount) {\
if(_array->size + _amount > _array->capacity) {\
size_t const new_capacity = _array->size + _amount;\
name##_grow(_array, new_capacity);\
}\
_array->size = _array->size + _amount;\
}\
inline void name##_pop(struct name *const _array) {\
--_array->size;\
}\
inline type *name##_begin(struct name *const _array) {\
return _array->data;\
}\
inline type *name##_end(struct name *const _array) {\
return _array->data + _array->size;\
}\
inline void name##_clear(struct name *const _array) {\
_array->size = 0;\
}\
inline int name##_empty(struct name *const _array) {\
return _array->size == 0;\
}\
void name##_zero(struct name *const _array) {\
memset(_array->data, 0, sizeof(type) * _array->size);\
}\
#endif // DARRAY_HEADER_INCLUDED
```