开发者

Typedef vs. container structure for platform abstraction?

I'm working on a small platform abstraction layer that I intend to use as a base for future projects. Originally, I was foll开发者_Go百科owing the lead of SDL and dynamically allocating a container structure.

For example, in the public header:

typedef struct MY_MUTEX MY_MUTEX;

In the Windows-specific source file:

struct MY_MUTEX {
    HANDLE handle;
};

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

But then I started wondering if I could ditch memory allocation altogether and just typedef the platform-specific type:

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

Avoiding unnecessary memory allocations seems like a good idea to me, but what kind of problems (if any) would this simple typedef method introduce? Would I be sacrificing a lot of flexibility?


You can use typedef, a container structure, or even macros -- any of those are fine. Even a mixture is fine. The important thing is that your abstraction behaves consistently across platforms, no matter which underlying implementation is used -- and this may make some choices unsuitable for some cases.

For example, it may not be reasonable to use a simple typedef to mimic a Windows Event object on Unix, so you might use a container struct for events... but that shouldn't stop you from using a typedef for mutexes, as long as that's sufficient for the way mutexes will be used through your abstraction.

I'm sure there are some who would prefer to stick to one approach for the whole API, but I don't see the need to as long as the abstraction appears and behaves consistently from one platform to another.

Basically, go with the lightest thing that works in each case.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜