首页 > 解决方案 > 奇怪的解析行为 _Atomic 与模板

问题描述

//clang 3.8.0

#include <iostream>

template<typename T>
_Atomic T* get_atomic(T* val) {
    return reinterpret_cast<_Atomic T*>(val);
}

int main()
{

    volatile int val = 1;
    _Atomic volatile int* val_ptr = reinterpret_cast<_Atomic volatile int*>(&val);
    // works as expected
    std::cout << *val_ptr;
    // Fails due to "_Atomic cannot be applied to qualified type 'volatile int'"
    //std::cout << "Hello, world!\n" << *get_atomic(&val);
}

为什么解析模板扩展的方式和解析显式扩展的方式有差异?它们应该是相同的。有没有办法确保 _Atomic 在存在模板参数的情况下被视为限定符?

标签: c++catomic

解决方案


该关键字_Atomic来自 C (C11),而不是 C++ 中的关键字。在 C++ 中,原子是通过std::atomic. 最好不要混合两种语言的句法概念。

如果您必须混合使用两种语言访问原子数据的代码,您应该处理原子类型,例如std::atomic_int,或发明一些类似于以下的宏接口

#ifdef __cplusplus
#define myAtomic(T) std::atomic< T >
#else
#define myAtomic(T) _Atomic(T)
#endif

在任何合理的平台上,这些都应该是二进制兼容的。


推荐阅读