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

Диагностическое правило основано на руководстве [MISRA](https://www.misra.org.uk/) \(Motor Industry Software Reliability Association\) по разработке программного обеспечения\.

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

Пример кода:

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

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

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

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

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

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

```cpp
struct A
{
    void foo();
};

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

Данная проблема известна как "[Most vexing parse](https://en.wikipedia.org/wiki/Most_vexing_parse)": компилятор разрешает данную неоднозначность "задекларировать функцию или объект" в пользу "задекларировать функцию"\. Поэтому, несмотря на ожидание программиста задекларировать объект класса 'A' и вызвать нестатическую функцию\-член класса 'A::foo', компилятор воспримет это как объявление функции 'a', не принимающей параметров и возвращающей тип 'A'\. 

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