我在项目内的多个文件中包含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;
答案 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_;