template<typename T>static inline T AtomicLoadAcquire(T const* addr){ T v = *const_cast<T const volatile*>(addr); cpuReaDWriteFence(); return v;}
由于C中没有模板,我使用的是函数或宏. GCC提供了一个
方便的扩展类型.也许我可以用voID *做到这一点?如果是这样的话?
到目前为止我所拥有的是:
#define AtomicLoadAcquire(addr) \ ({ typeof (addr) v = *(volatile typeof (addr) *)(addr); cpuReaDWriteFence(); })
但是,这不允许我这样做:
int x = AtomicStoreRelease(&bla);
我怎么能绕过这个?
解决方法 你几乎做对了. GCC “statements and declarations in expressions”扩展不必返回voID.The last thing in the compound statement should be an Expression followed by a semicolon; the value of this subExpression serves as the value of the entire construct. (If you use some other kind of statement last within the braces,the construct has type voID,and thus effectively no value.)
因此,您可以将宏定义为:
#define AtomicLoadAcquire(addr) \({ typeof (*addr) v = *(volatile typeof (addr) )(addr); cpuReaDWriteFence(); v; })
注意v;在宏的最后.这就是魔术的来源.
另请注意,第一个类型将* addr作为参数,并且在volatile类型(addr)之后没有星号.那些是与你的主要问题无关的一些小错误.
总结以上是内存溢出为你收集整理的如何将此c模板函数转换为C替代?全部内容,希望文章能够帮你解决如何将此c模板函数转换为C替代?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)