gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 03:48:40 24 4
gpt4 key购买 nike

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

#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但仍然不知道如何为这种情况做这件事

最佳答案

这几乎是等价的,除了宏在对其参数进行类型检查时比函数更宽松:

#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);
}

关于将一行函数转换为c中的宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22365790/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com