C宏添加到typename

cha*_*e55 3 c macros c-preprocessor

我正在尝试创建一个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;
}
Run Code Online (Sandbox Code Playgroud)

预处理器似乎不想扩展X,因为它是关于未定义符号的错误X_info.不知道我应该在宏上修改什么来解决这个问题.

Aas*_*set 8

您需要使用预处理器的标记串联功能; 否则它认为这X_info是一个令牌:

#define new(X) __new(&(X ## _info))
Run Code Online (Sandbox Code Playgroud)

预处理器将不扩大的原因XX_info是,这将创造很大的问题,如果确实是一个标识符,叫X_info你需要参考的宏.

作为旁注,还有字符串化功能:如果X是eg Person,"X"将保留"X",而#X将扩展为字符串常量"Person".