# V2574. MISRA. Functions should not be declared at block scope.

Данное диагностическое правило основано на руководстве MISRA (Motor Industry Software Reliability Association) по разработке программного обеспечения.

Данное диагностическое правило актуально только для C++. Функция, объявленная в области видимости блока, будет видна также в пространстве имён, обрамляющем блок.

Пример кода:

    namespace Foo
    {
      void func()
      {
        void bar(); // <=
        bar();
      }
    }

    void Foo::bar() // Function 'bar' is visible here
    {
    }

Программист хотел сузить область видимости функции, задекларировав её в блоке функции 'func'. Однако функция 'bar' видна также за пределами пространства имен 'Foo'. Поэтому следует задекларировать функцию явно в обрамляющем пространстве имён:

    namespace Foo
    {
      void bar();
      void func()
      {
        bar();
      }
    }

    void Foo::bar() // Function 'bar' is visible
    {
    }

Также, вследствие неоднозначности грамматики языка C++, декларация функции может выглядеть как декларация объекта:

    struct A
    {
        void foo();
    };

    int main()
    {
      A a();
      a.foo(); // compile-time error
    }

Данная проблема известна как "Most vexing parse": компилятор разрешает данную неоднозначность "задекларировать функцию или объект" в пользу "задекларировать функцию". Поэтому, несмотря на ожидание программиста задекларировать объект класса 'A' и вызвать нестатическую функцию-член класса 'A::foo', компилятор воспримет это как объявление функции 'a', не принимающей параметров и возвращающей тип 'A'.

Чтобы избежать путаницы, анализатор также предупреждает о таких объявлениях.

Данная диагностика классифицируется как:

MISRA-CPP-2008-3.1.2