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

标签 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 下工作?

最佳答案

您在定义此类 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/

相关文章:

c - 如何在其自己的 SIGCHLD 处理程序中获取设置进程的 PID?

c - 如何按字母顺序对字符串中的单词进行排序

json - 在Go中检查嵌套指针结构是否为nil的简便方法?

c - 将双指针传递给函数以获取链表的起始地址(C)

c++ - 调试断言失败

c - 我什么时候需要一个函数在 main() 之前或之后运行?

c - 手动运行gcc的步骤,编译,汇编,链接

c - 从文件中读取并使用指针将数据放入动态结构中

c - char* 到 Short 的转换是如何发生的?

python - 难以使用具有不同格式字符串的 Python struct.Struct.unpack_from