Пример:
#include <stdio.h>
#include <stdlib.h>
#define DEF_VECTOR(type) \
typedef struct vector_##type { \
type * data; \
size_t alloc_size; \
size_t size; \
} vector_##type; \
\
void init_vector_##type(vector_##type * vector) \
{ \
vector->data = NULL; \
vector->alloc_size = vector->size = 0; \
} \
\
void clear_vector_##type(vector_##type * vector) \
{ \
if (vector->data != NULL) {\
free(vector->data); \
init_vector_##type(vector); \
} \
} \
\
void push_back_vector_##type(vector_##type * vector, type value) \
{ \
if (vector->size == vector->alloc_size) { \
vector->alloc_size = (vector->alloc_size == 0) ? 16 : vector->alloc_size * 2; \
vector->data = realloc(vector->data, vector->alloc_size * sizeof(type)); \
\
if (vector->data == NULL) { \
/* do what you want */ \
} \
} \
vector->data[vector->size++] = value; \
} \
\
type at_vector_##type(vector_##type * vector, size_t index) \
{ \
if (index >= vector->size) { \
/* do what you want */ \
} \
return vector->data[index]; \
}
DEF_VECTOR(int)
int main()
{
vector_int v;
init_vector_int(&v);
push_back_vector_int(&v, 123);
push_back_vector_int(&v, 456);
printf("%d %d\n", at_vector_int(&v, 0), at_vector_int(&v, 1));
printf("%d %d\n", v.data[0], v.data[1]);
clear_vector_int(&v);
return 0;
}
Компиляция и выполнение:
pi@raspberrypi:/tmp $ gcc -g -pedantic -Wextra v.c
pi@raspberrypi:/tmp $ ./a.out
123 456
123 456
Выполнение под valgrind
pi@raspberrypi:/tmp $ valgrind ./a.out
==11108== Memcheck, a memory error detector
==11108== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
==11108== Using Valgrind-3.13.0 and LibVEX; rerun with -h for copyright info
==11108== Command: ./a.out
==11108==
123 456
123 456
==11108==
==11108== HEAP SUMMARY:
==11108== in use at exit: 0 bytes in 0 blocks
==11108== total heap usage: 2 allocs, 2 frees, 1,088 bytes allocated
==11108==
==11108== All heap blocks were freed -- no leaks are possible
==11108==
==11108== For counts of detected and suppressed errors, rerun with: -v
==11108== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 6 from 3)
Конечно, у вас естьне забыть позвонить init_vector_xx
, а при необходимости clear_vector_xx
и использовать макрос для определения всех, не помогают, когда у вас есть ошибка при выполнении, потому что у вас нет номера строки и т. д.
Здесь яПоместите все в уникальный макрос, в действительности лучше иметь макрос для определения struct и объявлять функции, а другой - для определения функций, чтобы иметь возможность поместить это в заголовки и источники.
есть ли какой-нибудь способ, которым мы можем использовать библиотеки c ++ и каким-либо образом прикрепить его к коду C
Не уверен, что на этот вопрос можно ответить.Конечно, вы можете получить некоторые идеи из их определений, потому что они хорошо реализованы, но вы также рискуете погрузиться в сложность, которая вам не нужна в вашем переводе.
Однако, если вы можете остаться вC ++ не переходить на C; -)