添加到类型名称的 C 宏

标签 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;
}

预处理器似乎不想展开 X,因为它出错了一个 undefined symbol X_info。不确定我应该在宏上更改什么来解决这个问题。

最佳答案

您需要使用预处理器的 token 连接功能;否则它认为 X_info本身就是一个 token :

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

预处理器不会扩展 X 的原因在 X_info如果实际上有一个名为 X_info 的标识符,这会产生大问题您需要在宏中引用的内容。

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

关于添加到类型名称的 C 宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15085730/

相关文章:

C++ 预处理器标准行为

c - C 预处理器是先删除注释还是先扩展宏?

c - 使用每个选项列表简化编译

没有malloc的完全封装

hadoop - 有人可以解释 pig 身上的这个奇怪错误吗

c - 从数组中获取 C 中某些值的内存地址

c - do{}while(0) - 宏安全

c++ - 在 C 或 C++ 中定义结构的宏

c - 阻止词法分析器读取文件中的第一个字符

c - 在 c 中使用 libpng 编写正弦波