我正在尝试创建一个 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/