Typedef против структуры контейнера для абстракции платформы? - PullRequest
3 голосов
/ 07 октября 2011

Я работаю над небольшим уровнем абстракции платформы, который я намерен использовать в качестве основы для будущих проектов. Первоначально я следовал примеру SDL и динамически выделял структуру контейнера.

Например, в публичном заголовке:

typedef struct MY_MUTEX MY_MUTEX;

В исходном файле для Windows:

struct MY_MUTEX {
    HANDLE handle;
};

MY_MUTEX *MY_CreateMutex() {
    MY_MUTEX *m = malloc(sizeof(MY_MUTEX));
    ...
    m->handle = CreateMutex(NULL, FALSE, NULL);
    ...
}

Но потом я начал задаваться вопросом, могу ли я вообще отказаться от выделения памяти и просто typedef тип, специфичный для платформы:

#ifdef _WIN32
typedef HANDLE MY_MUTEX;
#else
typedef pthread_mutex_t MY_MUTEX;
#endif

Мне кажется хорошей идеей избежать ненужного выделения памяти, но какие проблемы (если таковые имеются) может привести этот простой метод typedef? Буду ли я жертвовать большой гибкостью?

1 Ответ

2 голосов
/ 07 октября 2011

Вы можете использовать typedef, структуру контейнера или даже макросы - любой из них подойдет. Даже смесь в порядке. Важно то, что ваша абстракция ведет себя согласованно на всех платформах, независимо от того, какая базовая реализация используется - и это может сделать некоторые варианты неподходящими для некоторых случаев.

Например, может быть нецелесообразно использовать простой typedef для имитации объекта Windows Event в Unix, поэтому вы можете использовать контейнерную структуру для событий ... но это не должно мешать вам использовать typedef для мьютексов, если этого достаточно для использования мьютексов в вашей абстракции.

Я уверен, что есть некоторые, кто предпочел бы придерживаться одного подхода для всего API, но я не вижу необходимости в этом, пока абстракция появляется и ведет себя последовательно от одной платформы к другой.

По сути, используйте самую легкую вещь, которая работает в каждом конкретном случае.

...