这里有一个类似的问题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下因错误而失败 左值作为分配的左操作数。
如何让它在GCC下运作?
答案 0 :(得分:1)
在定义这样的ptradd
宏时,你可能错误。至少,它是非常糟糕的味道(如果指针或delta没有很好地对齐,或者如果实际的宏参数具有像p++
这样的副作用,则可能会变成未定义的行为。)
你可能也许会尝试(这应该通常适用于大多数C编译器,但我不建议写这个)
#define ptradd(Ptr,Delta) do{\
Ptr=(void*)((char*)(Ptr)+(Delta));}while(0)
但是我真的不喜欢这种不可读的宏。并使用它们,例如因为ptradd(p++,--i)
是一种灾难。
您甚至可以将void*
替换为typeof(*(Ptr))*
(这是GCC特定的)。
答案 1 :(得分: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);
}