0

这里有一个类似的问题Portable and safe way to add byte offset to any pointer

但所有答案都以ptr = (SomeType*)...开头,这意味着我必须知道指针的类型,而我想使用这个宏:

#define ptradd(ptr, delta) (size_t) ptr = (size_t) ptr + (size_t) delta
ptradd(prect, offset);

它在 VC 下工作,但在 GCC 下失败,错误 lvalue required as left operand of assignment

我怎样才能使它在 GCC 下工作?

4

2 回答 2

1

定义这样的宏可能是错误的。ptradd至少,这是非常糟糕的品味(如果指针或增量没有很好地对齐,或者如果实际的宏参数具有类似的副作用,则可能成为未定义的行为p++)。

您可能会尝试(这通常应该适用于大多数 C 编译器,但我不建议这样写)

 #define ptradd(Ptr,Delta) do{\
   Ptr=(void*)((char*)(Ptr)+(Delta));}while(0)

真的不喜欢这种难以理解的宏。并且使用它们,例如作为ptradd(p++,--i)灾难的一种方式。

您甚至可以替换为void*typeof(*(Ptr))*这是 GCC 特定的)。

于 2013-06-16T15:55:56.583 回答
0

尝试这个。

#include <stdio.h>
#include <stdlib.h>

#define ptradd(ptr, delta) (ptr = (typeof(ptr)) ((size_t) ptr + (size_t) delta))

int main() {
    int a;
    int* b = &a;
    printf("b=%p\n", b);
    ptradd(b, 5);
    printf("b=%p\n", b);
}
于 2013-06-16T16:22:58.910 回答