我将cl2.hpp header 包含在项目中的多个文件中,这触发了多个定义错误,但我不知道如何解决。

主要是因为我不知道在什么情况下需要__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;

最佳答案

使用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_;

关于c++ - 如何避免在变量上出现__attribute __((weak))多定义错误? [cl2.hpp],我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53159112/

10-10 05:24