Преработвам библиотека и се опитвам да се отърва от много 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())
е много неудобно поради сложността и дължината на този израз.
Добър начин ли е да се използва дефинирана стойност в стил C SIZE_MAX
или е по-добре да се създаде собствена константа като 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