我有一个函数,我想在不违反类型安全的情况下转换为宏
#define UINTPTR_MAX_XOR_WITH_1 (uintptr_t) (UINTPTR_MAX ^ 1)
struct node
{
unsigned long key;
tbb::atomic<struct node*> lChild; //format <address,flagBit>
tbb::atomic<struct node*> rChild; //format <address,flagBit>
};
struct node* getAddress(struct node* p)
{
return (struct node*)((uintptr_t) p & UINTPTR_MAX_XOR_WITH_1);
}
main()
{
nodeAddr = getAddress(node);
lNodeAddr = getAddress(node->lChild);
}
我尝试用此宏替换getAddress()
函数。我知道这个宏定义是错误的。
#define getAddress(p) ((struct node*) (uintptr_t) p & UINTPTR_MAX_XOR_WITH_1)
我读过这篇文章 Macro vs Function in C 但仍然无法想象如何为这种情况做这件事
答案 0 :(得分:1)
这几乎是等价的,除了在对其参数进行类型检查时,宏比函数更宽松:
#define getAddress(p) ((struct node*) ((uintptr_t) (struct node*)(p) & UINTPTR_MAX_XOR_WITH_1))
有些C编译器接受static inline
,这不是宏,但它等同于原始函数,并且在实践中大部分时间都会被内联:
static inline struct node* getAddress(struct node* p) {
return (struct node*)((uintptr_t) p & UINTPTR_MAX_XOR_WITH_1);
}