【问题标题】:Add offset to pointer with a macro (GCC)使用宏 (GCC) 向指针添加偏移量
【发布时间】:2013-06-16 15:52:53
【问题描述】:

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

【问题讨论】:

  • #define ptradd(ptr, delta) ptr = ((void*)((char*)ptr + delta))?注意,如果不满足对齐要求,则为UB。
  • 写这样一个宏是 IMNSHO 的一个错误...

标签: c pointers gcc offset


【解决方案1】:

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

您也许可以尝试(这通常适用于大多数 C 编译器,但我不建议这样写)

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

但是真的不喜欢这种不可读的宏。并使用它们,例如因为ptradd(p++,--i) 是一种灾难。

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

【讨论】:

    【解决方案2】:

    试试这个。

    #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);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-02
      • 2021-07-22
      • 1970-01-01
      • 2011-07-25
      • 1970-01-01
      • 2022-06-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多