﻿# V3516\. AUTOSAR\. A switch\-label should only appear at the top level of the compound statement forming the body of a 'switch' statement\.

Данное диагностическое правило основано на руководстве [AUTOSAR](https://www.autosar.org/) \(AUTomotive Open System ARchitecture\) по разработке программного обеспечения\.

Область видимости, в которой находится метка, должна быть составным выражением, которое представляет собой тело 'switch'\. Это означает, что метка не должна быть вложена ни в какой блок, кроме как в тело 'switch', и это тело должно быть составным выражением\.

Следовательно, все метки, принадлежащие одному 'switch', должны находиться в одной области видимости\. Следование этому правилу позволяет сохранить читаемость и структурированность кода\.

Пример 1: 

```cpp
void example_1(int param, bool b)
{
  switch (param)
  {
  case 1:
    DoSmth1();
    if (b)
    {
  case 2: // <=
    DoSmth2();
    }
    break;
  default:
    assert(false);
    break;
  }
}
```

Рассмотренный пример сложен для понимания\. Чтобы анализатор не выдавал предупреждения, следует написать так:

```cpp
void example_1(int param, bool b)
{
  switch (param)
  {
  case 1:
    DoSmth1();
    if (b)
    {
      DoSmth2();
    }
    break;
  case 2:
    DoSmth2();
    break;
  default:
    assert(false);
    break;
  }
}
```

В следующем примере тело 'switch' не является составным, поэтому анализатор также выдаст предупреждение:

```cpp
void example_2(int param)
{
  switch (param)
    default:
      DoDefault();
}
```

Исправленный вариант:

```cpp
void example_2(int param)
{
  switch (param)
  {
    default:
      DoDefault();
      break;
  }
}
```