代码之家  ›  专栏  ›  技术社区  ›  DutChen18

如何在C宏中内联触发隐式指针转换?

  •  1
  • DutChen18  · 技术社区  · 1 年前

    上下文

    我有一些函数可以支持在库中使用自定义内存分配器:

    void *(allocate)(struct allocator *allocator, size_t size, size_t alignment);
    void (deallocate)(struct allocator *allocator, void *pointer, size_t size, size_t alignment);
    

    我仍然想通过这个界面改进两件事:

    1. 有必要写 sizeof(type) alignof(type) 用于每次分配和解除分配。
    2. 类型 void * 允许错误地使用指向大小或对齐方式无效的类型的指针。

    这两个问题都可以通过一些简单的宏来解决:

    #define allocate(allocator, type, count) \
        (type *)(allocate)(allocator, sizeof(type) * (count), alignof(type))
    
    #define deallocate(allocator, pointer, type, count) \
        do { \
            type *typed_pointer = pointer; \
            (deallocate)(allocator, typed_pointer, sizeof(type) * (count), alignof(type)); \
        } while (0)
    

    宏负责调用 sizeof(类型) alignof(类型) ,还执行指向给定类型的指针的强制转换,以便编译器在将其用作其他类型时发出警告。

    问题

    deallocate 没有返回值,所以我们可以将其实现为带有变量的块,以执行隐式指针强制转换。但对于一个函数 返回一个值,也许 reallocate ,我们不能以相同的方式对传递给宏的指针进行类型检查。

    有没有任何方法可以在表达式内部内联执行这种“类型检查”隐式强制转换,以便宏可以有结果?

    编辑:如果可能的话,我想坚持使用没有任何GNU或其他扩展的标准C。

    1 回复  |  直到 1 年前
        1
  •  1
  •   Eric Postpischil    1 年前

    复合文字是可以分配给的对象,因此您可以编写 (type *) {0} = (pointer) 作为的论据 reallocate ,编译器将进行其通常的检查,以确定是否分配给指针类型。赋值表达式的值将是分配给复合文字的新值。

    并不是所有类型都可以用这种方式处理,因为追加 * 指向一个类型并不一定会产生指向该类型的指针。例如 int [] 会产生 int [] * ,这将不起作用。您的已经存在该问题 (type *) 铸造 allocate 。用户可以使用 typedef 对于任何类型,然后传递 类型定义 名称

    推荐文章