3

私はCマクロを作成しようとしています。このマクロには、型名が追加_infoされ、そのアドレスを取得して、それを使用して関数を呼び出します。サンプルコード(機能しません):

#define new(X) __new(&(X_info))

struct classInfo
{
    size_t size;
    void* (*constructor)(void* p);
};

void* __new(struct classInfo* info, ...)
{
    return info->constructor(malloc(info->size));
}

void* queue_constructor(void* p)
{
    return p;
}

typedef struct
{
    uint64_t data;
} queue_t;

const struct classInfo queue_t_info = { .size        = sizeof(queue_t),
                                        .constructor = &queue_constructor};

int main(int argc, char** argv)
{
    queue_t* p = new(queue_t);
    return 0;
}

プリプロセッサは、未定義のシンボルについてエラーが発生しているため、Xを拡張したくないようですX_info。これを修正するためにマクロで何を変更すべきかわからない。

4

1 に答える 1

8

プリプロセッサのトークン連結機能を使用する必要があります。それ以外の場合X_infoは、それ自体がトークンであると見なします。

#define new(X) __new(&(X ## _info))

プリプロセッサがで展開しない理由はX、マクロで参照する必要X_infoがあるという識別子が実際に存在する場合、これにより大きな問題が発生するためです。X_info

補足として、文字列化機能もありますXたとえばPerson、の場合、"X"は残りますが"X"#X文字列定数に展開されます"Person"

于 2013-02-26T09:43:21.960 に答える