Можете ли вы добавить возвращаемое значение в качестве параметра макроса? Примерно так:
#define AtomicLoadAcquire(addr, ret) \
( typeof (addr) v = *(volatile typeof (addr) *)(addr); CpuReadWriteFence(); )
Это ужасно, но это сделает это за вас:
AtomicLoadAcquire(someaddr, x);
переведено на:
/* assuming someaddr is int* */
int x = *(volatile int *)(someaddr); CpuReadWriteFence();
/* now you have x defined */.
Что будет именно так, как вы хотите.
Другой вариант (как упомянуто в miaout17) - объявить x
перед вызовом макроса, а затем удалить «typeof(addr)
» в начале, что будет безопаснее, ИМХО.