Я хочу разработать библиотеку с ANSI C.
У меня есть string
struct
:
struct libme_string
{
char* buffer;
int length;
};
Я хочу написать функцию libme_create_string()
, которая создает и инициализирует string
(как конструкторы в C ++).
Какой из этих методов лучше разработать libme_create_string()
?
Метод № 1
Выделите память для строкового объекта в libme_create_string()
и верните ее:
struct libme_string* libme_create_string(int length)
{
// Check arguments...
// Allocate memory for object.
struct libme_string* str = malloc(sizeof(struct libme_string));
// Handle memory allocation errors...
str->buffer = malloc(length);
str->length = length;
// Handle memory allocation errors...
return str;
}
void libme_delete_string(struct libme_string* str)
{
// Check arguments...
free(str->buffer);
free(str);
}
Используйте
struct libme_string* str;
str = libme_create_string(1024);
// ...
libme_delete_string(str);
str = NULL;
Метод № 2
Не выделяйте память для строкового объекта в функции libme_create_string()
, примите это в качестве аргумента:
struct void libme_create_string(libme_string* str, int length)
{
// Check arguments...
// Just allocate memory for members.
str->buffer = malloc(length);
str->length = length;
// Handle memory allocation errors...
}
void libme_delete_string(struct libme_string* str)
{
// Check arguments...
free(str->buffer);
}
Используйте
struct libme_string str; // << different, not a pointer!
libme_create_string(&str, 1024);
// ...
libme_delete_string(&str);
Примечания
string
просто образец.
- Метод № 2 быстрее, не так ли?
Наконец, есть ли хорошие рекомендации по проектированию библиотек, написанных на C?