как избежать __attribute __ ((слабая)) ошибка множественного определения переменных? [Cl2.hpp] - PullRequest
0 голосов
/ 05 ноября 2018

Я включаю заголовок cl2.hpp в несколько файлов в моем проекте, и это вызвало ошибку множественного определения, и я не знаю, как ее исправить.

Главным образом, потому что я не знаю, в каких случаях нужен __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 голосов
/ 05 ноября 2018

С 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_;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...