C 平台抽象的Typedef与容器结构?

C 平台抽象的Typedef与容器结构?,c,struct,cross-platform,typedef,C,Struct,Cross Platform,Typedef,我正在一个小型的平台抽象层上工作,我打算将其用作未来项目的基础。最初,我遵循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->

我正在一个小型的平台抽象层上工作,我打算将其用作未来项目的基础。最初,我遵循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
方法会带来什么样的问题(如果有的话)?我会牺牲很多灵活性吗?

您可以使用
typedef
、容器结构,甚至宏——这些都可以。即使是混合物也可以。重要的是,无论使用哪种底层实现,您的抽象在不同平台上的行为都是一致的——这可能会使某些选择不适合某些情况

例如,在Unix上使用简单的
typedef
来模拟Windows事件对象可能是不合理的,因此您可以使用容器结构来处理事件。。。但这不应阻止您对互斥体使用
typedef
,只要这足以满足通过抽象使用互斥体的方式

我确信有一些人更愿意在整个API中使用一种方法,但我认为只要抽象在一个平台和另一个平台之间表现一致,就没有必要这样做

基本上,在每种情况下使用最轻的东西