﻿# V608\. Recurring sequence of explicit type casts\.

Анализатор обнаружил повторяющиеся последовательности, состоящие из операторов явного приведения типов\. Как правило, подобный код появляется из\-за опечаток и не приводит к возникновению ошибок\. Однако разумно проверить фрагменты кода, где анализатор выдает предупреждение V608\. Возможно, ошибка всё\-таки есть\. Или, по крайней мере, код можно упростить\.

Рассмотрим пример:

```cpp
m_hIcon = AfxGetApp()->LoadStandardIcon(
  MAKEINTRESOURCE(IDI_ASTERISK));
```

Анализатор выдаст предупреждение:  V608 "Recurring sequence of explicit type casts: \(LPSTR\)\(ULONG\_PTR\)\(WORD\) \(LPSTR\)\(ULONG\_PTR\)\(WORD\)\."

Давайте разберемся, откуда взялись две цепочки "\(LPSTR\)\(ULONG\_PTR\)\(WORD\)"\.

Константное значение IDI\_ASTERISK представляет собой макрос вида:

```cpp
#define IDI_ASTERISK MAKEINTRESOURCE(32516)
```

Это значит, что приведенный выше код эквивалентен этому:

```cpp
m_hIcon = AfxGetApp()->LoadStandardIcon(
  MAKEINTRESOURCE(MAKEINTRESOURCE(32516)));
```

Макрос MAKEINTRESOURCE разворачивается в \(LPSTR\)\(\(DWORD\)\(\(WORD\)\(i\)\)\)\. В результате получается следующая последовательность:

```cpp
m_hIcon = AfxGetApp()->LoadStandardIcon(
  (LPSTR)((DWORD)((WORD)((LPSTR)((DWORD)((WORD)((32516))))))
);
```

Этот код будет корректно работать, но он избыточен\. Код можно переписать без лишних приведений типов:

```cpp
m_hIcon = AfxGetApp()->LoadStandardIcon(IDI_ASTERISK);
```