Может ли параметр функции скрывать идентификатор другой функции?

#c #static-code-analysis #misra

#c #статический анализ кода #мисра

Вопрос:

Статический анализ кода идентифицирует параметры конструктора begin и end как имена, которые скрывают соответствующие функции-члены (функции чтения) в соответствии с правилом Misra 2-10-2 (идентификаторы, объявленные во внутренней области, не должны скрывать идентификатор, объявленный во внешней области). Правильно ли это?

 template <typename T>
class TLineSegment
{
public:
   TLineSegment(const point_typeamp; begin, const point_typeamp; end)
      : m_begin(begin)
      , m_end(end)
   {
   }

   const point_typeamp; begin() const
   {
      return m_begin;
   }

   const point_typeamp; end() const
   {
      return m_end;
   }

private:
   point_type m_begin;
   point_type m_end;
}
 

Комментарии:

1. ДА. Внутри конструктора запись begin всегда ссылается на параметр (если вы явно не добавляете к нему префикс this-> )

2. Но разве я не стал бы — так же, как я всегда ссылался бы на параметр с begin помощью — всегда ссылаться на функцию-член при записи begin() ?

3. @Max Нет, begin() попытался бы вызвать operator() параметр (который, вероятно, не существует). Круглые скобки не являются частью имени.

4. Именно по этой причине существует правило. У вас есть параметр const point_typeamp; begin и функция-член const point_typeamp; begin() … довольно запутанно. Де-факто стандартным способом именования функций-членов будет get_begin() etc. Если вы не кодируете iterator интерфейс, подобный интерфейсу, тогда имена членов должны быть begin и end, и вместо этого вам придется переименовать параметры.

Ответ №1:

В моем понимании это правило MISRA касается удобочитаемости кода и избежания путаницы, а не нарушения кода.

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

Если довести до крайности, какой-нибудь программист, не уделяющий особого внимания, может запутаться, используя одни и те же имена.

Но с практической точки зрения это действительно деталь, и, на мой взгляд, ее можно оставить такой, какая она есть. Но если ваша компания применяет правила MISRA, вы должны это исправить.

Ответ №2:

Компилятор сначала просматривает имена, а затем решает, что с ними делать. То begin же самое относится и к имени аргумента функции. Компилятор не будет смотреть дальше этого, чтобы увидеть, есть ли какое-то другое определение, которое можно использовать при вызове функции.