这里有一个类似的问题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 下工作?
最佳答案
您在定义此类 ptradd
宏时可能错误。至少,这是非常糟糕的品味(如果指针或增量没有很好地对齐,或者如果实际的宏参数具有像 p++
这样的副作用,则可能会变成未定义的行为)。
您也许可以尝试(这通常应该适用于大多数 C 编译器,但我不建议这样做)
#define ptradd(Ptr,Delta) do{\
Ptr=(void*)((char*)(Ptr)+(Delta));}while(0)
但是我真的不喜欢这种不可读的宏。并使用它们,例如因为 ptradd(p++,--i)
是一种灾难。
您甚至可以将 void*
替换为 typeof(*(Ptr))*
(这是 GCC 特定的)。
关于c - 使用宏(GCC)向指针添加偏移量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17135052/