将单行函数转换为c中的宏

时间:2014-03-12 23:10:04

标签: c macros

我有一个函数,我想在不违反类型安全的情况下转换为宏

#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 但仍然无法想象如何为这种情况做这件事

1 个答案:

答案 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);
}