如何避免在变量上出现__attribute __((weak))多定义错误? [cl2.hpp]

时间:2018-11-05 17:15:37

标签: c++ compiler-errors opencl

我在项目内的多个文件中包含https://developer.apple.com/documentation/foundation/nsdictionary/2879139-writetourl?language=objc标头,这触发了多个定义错误,我不知道如何解决。

主要是因为我不知道在什么情况下需要__attribute__((weak))或使用它的方式。有人可以帮我吗?

我也不知道删除使用__attribute__((weak))的行是否是一个好主意,还是我应该使用其他修饰符?

例如:

# define CL_HPP_DEFINE_STATIC_MEMBER_ __attribute__((weak))

class Device : public detail::Wrapper<cl_device_id>
{
private:
    static std::once_flag default_initialized_;
    static Device default_;
    static cl_int default_error_;
    //More code
}

CL_HPP_DEFINE_STATIC_MEMBER_ std::once_flag Device::default_initialized_;
CL_HPP_DEFINE_STATIC_MEMBER_ Device Device::default_;
CL_HPP_DEFINE_STATIC_MEMBER_ cl_int Device::default_error_ = CL_SUCCESS;

class Platform : public detail::Wrapper<cl_platform_id>
{
private:
    static std::once_flag default_initialized_;
    static Platform default_;
    static cl_int default_error_;
    //More code
}

CL_HPP_DEFINE_STATIC_MEMBER_ std::once_flag Platform::default_initialized_;
CL_HPP_DEFINE_STATIC_MEMBER_ Platform Platform::default_;
CL_HPP_DEFINE_STATIC_MEMBER_ cl_int Platform::default_error_ = CL_SUCCESS;

1 个答案:

答案 0 :(得分:0)

使用C ++ 17,您可以将这些字段声明为内联:

class Device : public detail::Wrapper<cl_device_id>
{
private:
    static inline std::once_flag default_initialized_;
    static inline Device default_;
    static inline cl_int default_error_;
    //More code
}

在C ++ 17之前,您可以使用带有模板的技巧:

template<typename x_Dummy>
class t_StaticFieldsHolder
{
    friend class Device;
    static std::once_flag default_initialized_;
    static Device default_;
    static cl_int default_error_;
};

template<typename x_Dummy> 
std::once_flag t_StaticFieldsHolder<x_Dummy>::default_initialized_;

template<typename x_Dummy> 
Device t_StaticFieldsHolder<x_Dummy>::default_;

template<typename x_Dummy> 
cl_int t_StaticFieldsHolder<x_Dummy>::default_error_;