Я сделал следующий код, чтобы сделать мой код менее уродливым и не беспокоиться о слишком агрессивном отделении реализации Windows от остального кода.
#pragma once
#ifdef _WIN32
#include "windows.h"
namespace RawHttp
{
namespace Win
{
using Bool = BOOL;
using Handle = HANDLE;
using Dword = DWORD;
constexpr const Handle Null = NULL;
constexpr const Handle InvalidHandle = static_cast<Handle>(INVALID_HANDLE_VALUE);
}
}
#else
namespace RawHttp
{
namespace Win
{
using Bool = bool;
using Handle = void *;
using Dword = unsigned long;
constexpr const Handle Null = nullptr;
constexpr const Handle InvalidHandle = (Handle)(long long)-1;
}
}
#endif //_WIN32
Если он включен в файл C++, он не скомпилируется в Visual Studio:
windows\windowstypes.h(14): error C2131: expression did not evaluate to a constant
windows\windowstypes.h(14): note: failure was caused by unevaluable pointer value
В G++ компилируется нормально. Что вообще означает эта ошибка?
Как правильно преобразовать INVALID_HANDLE_VALUE
окна в constexpr void*
и как сделать то же самое в не-оконной ветке кода выше?
Моя версия Visual Studio — 15.9.18.
INVALID_HANDLE_VALUE
, оно уже введено какHANDLE
. - person Remy Lebeau   schedule 23.05.2021(long long)-1
вместо этого можно записать как-1LL
. - person Remy Lebeau   schedule 23.05.2021reinterpret_cast
(или приведение в стиле C) к типу указателяconstexpr
. - person Adrian Mole   schedule 24.05.2021INVALID_HANDLE_VALUE
уже включает приведение в стиле C. Но и без этого он также потерпит неудачу, потому что вы не можете статически привести (ненулевой) целочисленный литерал к указателю. Как это обойти - вопрос более сложный. - person Adrian Mole   schedule 24.05.2021constexpr
и оставитьInvalidHandle
как (статический)const
. - person Adrian Mole   schedule 24.05.2021