Humanity

Edit the world by your favorite way

Cで二重typedefを避ける

今日id:mattnさんのブログで前見たハックを実際に使う場面があった。

apr.h

typedef int uid_t;


perl.h

typedef long uid_t;


もちろんこのヘッダを同時に読み込むとエラーになるんですが、こういう場合に私がよく使う手として

#define uid_t _uid_t
#include <apr.h>
#undef uid_t
#include <perl.h>

てな具合に前の宣言を逃してやって、後の宣言を有効に出来る。

Big Sky :: mod_psgiをWindowsポーティングした。

で、実際使ったのはこんなソース。

#include "alloc-list.h"
#include "util.h"

// I want to see the definition of struct List_tag,
// But I don't want to see typedef of List
// to avoid multiple List's typedef definition.
#define List    List__
    #include "mylib/list/list.h"
#undef List

static List    *pointers_list;

行頭でincludeしてるalloc-list.hでcommon.hというヘッダをincludeしてて、その中に

typedef struct List_tag         List;

というものがあるので、そのtypedefの定義を使いたいということでmylib/list/list.hのtypedefをListじゃなくList__にしたと。
これは使える。id:mattnさん自身も「気持ち悪い」と言っている通りちょっと裏技的な感じがするけど。


関係ないけど全体的にソースが汚すぎる...
pointers_listなんてグローバル変数だしなぁ。pointers_listだけだけど。
電卓だしそんなにたくさんのメモリ確保しないだろうということで、GC実装する予定だったのをサボってpointers_listにアロケートしたポインタを放り込みmain()でfree()するというような適当なアレなので間に合わせというかなんというか(ry