我正在开发一个小平台抽象层,我打算将其用作未来项目的基础。最初,我跟随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
方法会引入什么样的问题(如果有的话)?我会牺牲很多灵活性吗?
答案 0 :(得分:2)
您可以使用typedef
,容器结构甚至宏 - 任何一个都可以。即使是混合物也没问题。重要的是,无论使用哪种底层实现,您的抽象行为都会在不同平台上保持一致 - 这可能会使某些选择在某些情况下不适用。
例如,使用简单的typedef
模仿Unix上的Windows事件对象可能不合理,因此您可能会使用容器结构来处理事件......但这不应该阻止您使用一个typedef
用于互斥锁,只要这对于通过抽象使用互斥锁的方式就足够了。
我确信有些人更倾向于坚持使用一种方法来处理整个API,但是我不认为只要抽象出现并且从一个平台到另一个平台的行为一致就不需要。
基本上,请使用每种情况下最轻的东西。