我将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/