使用宏(GCC)向指针添加偏移量

时间:2013-06-16 15:52:53

标签: c pointers gcc offset

这里有一个类似的问题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下运作?

2 个答案:

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