﻿# /Wp64

**/Wp64** \(Detect 64\-Bit Portability Issues\) \- ключ компилятора Visual C\+\+\. Ключ появился в Visual Studio 2003 и предназначался для подготовки миграции приложений на 64\-битные системы\. В Visual Studio 2008 ключ /Wp64 считается устаревшим, поскольку надо уже давно компилировать 64\-битные приложения, а не готовиться к этому\.

При задании ключа /Wp64 компилятор выявляет некоторые потенциальные ошибки, которые могут возникнуть при компиляции Си/Си\+\+ кода для 64\-битных систем\. Проверка кода заключается в том, что типы, которые отмечены в 32\-битном коде ключевым словом [\_\_w64](https://pvs-studio.ru/ru/blog/terms/0053/) интерпретируются при проверке как 64\-битные типы\.

Например, если мы имеем следующий код:

```cpp
typedef int MyInt32;
#ifdef _WIN64
  typedef __int64 MySSizet;
#else
  typedef int MySSizet;
#endif
void foo() {
  MyInt32 value32 = 10;
  MySSizet size = 20;
  value32 = size;
}
```

Выражение "value32 \= size;" на 64\-битной системе приведет к урезанию значения, а следовательно к потенциальной ошибке\. Мы хотим это диагностировать\. Но при компиляции 32\-битного приложения, все корректно и мы не получим предупреждения\.

Чтобы подготовиться к 64\-битным системам нам следует добавить ключ /Wp64 и вставить ключевое слово \_\_w64 при описании типа MySSizet в 32\-битном варианте\. В результате код станет выглядеть так:

```cpp
typedef int MyInt32;
#ifdef _WIN64
  typedef __int64 MySSizet;
#else
  typedef int __w64 MySSizet; // Add __w64 keyword
#endif
void foo() {
  MyInt32 value32 = 10;
  MySSizet size = 20;
  value32 = size; // C4244 64-bit int assigned to 32-bit int
}
```

Теперь мы получим предупреждение C4244, которое поможет подготовиться к переносу кода на 64\-битную платформу\.

Следует понимать, что возможности /Wp64 достаточно ограничены\. Более детальную и специализированную проверку кода может осуществить коммерческий инструмент [Viva64](https://pvs-studio.ru/ru/pvs-studio/), специально созданный для облегчения переноса приложений на 64\-битные системы\.

## Библиографический список

1. Андрей Карпов\. [64 бита, /Wp64, Visual Studio 2008, Viva64 и все, все, все](https://pvs-studio.ru/ru/blog/posts/cpp/a0021/)\.\.\.
1. MSDN\. [Option /Wp64 \(Detect 64\-Bit Portability Issues\)](https://www.microsoft.com/en-us/download/details.aspx?id=55984)\.
1. MSDN\. [Microsoft Specific keyword \_\_w64](https://www.microsoft.com/en-us/download/details.aspx?id=55984)\.
1. Андрей Карпов, Евгений Рыжков\. [Уроки разработки 64\-битных приложений на языке Си/Си\+\+](https://pvs-studio.ru/ru/blog/lessons/)\.