Я рефакторинг библиотеки и пытаюсь избавиться от многих предупреждений gcc. Большая часть этих предупреждений касается сравнения знаковых и беззнаковых и связана с использованием size_t
. Библиотека работает на 64-битных системах Linux.
Программист использовал -1 как специальное значение, подобное std::string::npos
. В библиотеке много мест, где код выглядит так:
class AnnotationBase
{
public:
size_t m_offset = -1;
size_t m_length = -1;
}
...
AnnotationBase foo(const std::string& text, const AnnotationBase& annot)
{
AnnotationBase newAnnot;
// do some job with annotations and text
...
if(newAnnot.m_offset == -1)
{
// do some other job
...
}
return newAnnot;
}
Проблема кроется в предупреждении, которое gcc генерирует в строке if(newAnnot.m_offset == -1)
из-за сравнения со знаком/без знака:
"warning: comparison between signed and unsigned integer expressions [-Wsign-compare]"
Как правильно сравнивать переменную size_t
в C++ с максимальным значением (-1) без предупреждения? Делать это как if(newAnnot.m_offset == std::numeric_limits<size_t>::max())
очень неудобно из-за сложности и длины этого выражения.
Это хороший способ использовать значение SIZE_MAX
, определенное в стиле C, или лучше создать собственную константу, например namesapce libling { const NONE = std::numeric_limits<size_t>::max(); }
(создание новой константы приводит к появлению множества похожих констант в разных библиотеках и пространствах имен, таких как libling::NONE
, libother::UNKNOWN
, liblongnamesapcename::NOTHING
)?
if (newAnnot.m_offset == NoneOffset) ...
, который затем можно объявить какconst size_t NoneOffset = -1;
, что должно решить проблему. Использование вашего определенияNONE
также сработает. - person Mats Petersson   schedule 02.08.2014