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

问题描述 投票:0回答: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(type)
alignof(type)
,并且还将指针强制转换为给定类型,以便编译器在将其用作不同类型时发出警告。

问题

deallocate
没有返回值,因此我们可以将其实现为带有变量的块来执行隐式指针转换。但对于确实返回值的函数,也许是
reallocate
,我们无法以相同的方式对传递给宏的指针进行类型检查。

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

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

c casting expression implicit-conversion type-safety
1个回答
0
投票

复合文字是可以赋值的对象,因此您可以将

(type *) {0} = (pointer)
写为
reallocate
的参数,编译器将执行通常的检查以检查指针类型的赋值。赋值表达式的值将是分配给复合文字的新值。

© www.soinside.com 2019 - 2024. All rights reserved.