﻿# V3549\. AUTOSAR\. The global namespace should only contain 'main', namespace declarations and 'extern "C"' declarations\.

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

Объявления в глобальном пространстве, засоряют список доступных идентификаторов\. Новые идентификаторы, добавленные в область видимости блока, могут быть схожими с идентификаторами в глобальном пространстве\.  Это может запутать разработчика и привести к ошибочному выбору идентификатора\.

Чтобы гарантировать ожидания разработчика, все идентификаторы должны располагаться внутри соответствующих пространств имен\.

Пример кода, на который анализатор выдает предупреждение:

```cpp
int x1;
void foo();
```

В соответствии с правилом данный код должен выглядеть следующим образом:

```cpp
namespace N1
{
  int x1;
  void foo();
}
```

Также допустимый вариант c extern "C" может выглядеть так:

```cpp
extern "C"
{
  int x1;
}
extern "C" void bar();
```

Согласно стандарту AUTOSAR разрешено использовать 'typedef' в глобальном пространстве имен в том случае, если имя псевдонима типа содержит в себе размер его итогового типа\.

Пример кода, на который анализатор не выдает предупреждений:

```cpp
typedef short int16_t;
typedef int INT32;
typedef unsigned long long Uint64;
```

Пример кода, на который анализатор выдает предупреждения:

```cpp
typedef std::map<std::string, std::string> TestData;
typedef int type1;
```