2014-12-02 2 views
1

я определил ЬурейеЕ и:проверить, инициализирован ли запуск boost_xy или нет?

typedef boost::geometry::model::d2::point_xy<double> boost2dPoint; 
boost2dPoint min_p; 
//. 
//.(under a condition: min_p will be initialized) 
//. 
for(Region::Iterator itv = s.beginVer(); itv != s.endVer(); ++itv) 
{ 
    Region::Point v_point = (*itv).pnt(); 
    if((v_point(0) == min_p.x()) && (v_point(1) == min_p.y())) 
    { 
    return *itv; 
    } 
} 

я получил предупреждение

‘min_p’ may be used uninitialized in this function [-Wmaybe-uninitialized] 

как я могу проверить, если min_p инициализируется или нет ??

ответ

0

Вы получите это предупреждение, если попытаетесь использовать переменную, которая имеет любой шанс быть неинициализированной. Вам необходимо предоставить инициализацию для каждого пути. Либо укажите инициализацию по умолчанию при объявлении переменной, либо укажите значение в случае вашего условия else.

+0

спасибо за ваш ответ, но мне интересно, есть ли встроенная функция в boost для нулевого объекта. –

0

Это не состояние времени выполнения.

Я не статический анализ (compiletime) deseostic.

Просто инициализируйте свои данные.

boost2dPoint min_p {}; 

или

boost2dPoint min_p (0,0); 
+0

Спасибо за ответ, но за второе предложение: какой бой есть v_point (0,0); то вместо nullentity он вернет неправильный результат. –

+0

также он должен быть инициализирован для boost2dPoint min_p {}; в противном случае: ошибка: в C++ 98 'min_p' должен быть инициализирован конструктором, а не '{...}' –

+0

Какой нулевой смысл, о чем вы, кажется, говорите? Обратите внимание, что 'min_p = {}' будет работать в C++ 98 (агрегатная инициализация). Я решительно полагаю, что реализация point_xy по умолчанию - это очень POD. Не будет «нулевой». – sehe

1

Вы не можете, по крайней мере, не в одиночку, что объект. Неинициализированные данные специально не отмечены, он просто не имеет указанного значения. Вы могли бы иметь bool флаг, который первоначально установлен в false и установить его в true когда min_p инициализируется, хотя, если вы собираетесь этот маршрут, я предлагаю использовать boost::optional:

// this is default-initialized to know that its 
// data part (a boost2dpoint) is uninitialized 
boost::optional<boost2dpoint> min_p; 

// initialize later 
if(some_condition()) { 
    min_p = boost2dpoint(foo, bar); 
} 

// use still later: 

// Check if min_p has associated data. 
if(min_p) { 
    for(Region::Iterator itv = s.beginVer(); itv != s.endVer(); ++itv) 
    { 
    Region::Point v_point = (*itv).pnt(); 

          // +-- note: -> instead of . here. boost::optional is 
          // v     designed to look like a pointer.   
    if((v_point(0) == min_p->x()) && (v_point(1) == min_p->y())) 
    { 
     return *itv; 
    } 
    } 
} 

Я оставлю ссылку до the documentation, что не очень долго.

+0

Спасибо, хотя я использую if (min_p.is_initialized()) {...}; Я все еще получаю '* ((void *) & min_p +8)', который может использоваться неинициализированным в этой функции [-Wmaybe-uninitialized] –

+0

Предупреждение является ложным. Странно, что вы это поняли; это предупреждение было зафиксировано много веков назад. Вы используете очень старую версию gcc или boost? – Wintermute

+0

boost 1.56, gcc 4.7.2 –

Смежные вопросы