我正在将一个小型 C++ 库的一部分转换为 C (gcc)。在这样做时,我想将以下模板函数转换为宏(为了便于阅读,删除了注释)。CpuReadWriteFence() 是我成功转换为宏的另一个函数。
template<typename T>
static inline T AtomicLoadAcquire(T const* addr)
{
T v = *const_cast<T const volatile*>(addr);
CpuReadWriteFence();
return v;
}
由于 C 中没有模板,我要么使用函数,要么使用宏。GCC 提供了一个方便的 typeof 扩展。也许我可以用 void* 做到这一点?如果是这样怎么办?
我到目前为止是这样的:
#define AtomicLoadAcquire(addr) \
({ typeof (addr) v = *(volatile typeof (addr) *)(addr); CpuReadWriteFence(); })
但是,这不允许我这样做:
int x = AtomicStoreRelease(&bla);
我将如何解决这个问题?