【发布时间】:2015-11-27 19:24:59
【问题描述】:
我正在尝试在 win32 API(无 mfc)上编写一些直接的 c++。 使用这个更现代的 c++ 编译器,我得到:
警告 C4838:从“unsigned int”到“int”的转换需要缩小转换
它发生在这段代码中:
EvMap<DlgCtl> DlgCtl::_evMap [] = {
{IDC_LIST, NM_CLICK, & DlgCtl::Pik},
{0}
};
riiiiight 在右大括号前面。控件 id 的 0 表示数组的结尾。 此代码将控件 ID 和事件 ID 映射到类似于 MFC 的本地函数。
我想缩小转换意味着您在将 unsigned in 隐式转换为 int 时会丢失精度(因为 unsigned 可以容纳 > 32767 而 int 不能)。
我不确定 unsigned int 是什么。有一个 0,但那是一个有符号整数,对吧?
下面的代码使用列表在 winproc-ish 类中调度类本地函数。
template <class T>
struct EvMap {int ctrl, evnt; void (T::* func)(LPARAM l);};
template <class T>
bool DoEvMap (T *ths, EvMap<T> *evMap, int ctrl, int evnt, LPARAM l)
{
//DBG("DoEvMap ctrl=`d evnt=`d", ctrl, evnt);
for (int i = 0; evMap [i].ctrl; i++) {
//DBG(" - check ctrl=`d evnt=`d", evMap [i].ctrl, evMap [i].evnt);
if ((ctrl == evMap [i].ctrl) && (evnt == evMap [i].evnt))
{(ths->*(evMap [i].func)) (l); return true;}
}
return false;
}
我不想关闭警告,因为那只是一种糟糕的形式。我尝试将 static_cast
我怎样才能使用这个讨厌的编译器继续生活?
【问题讨论】:
-
0 是有符号整数。 0u 未签名。应该发生缩小,因为 0 是作为函数的地址提供的 - 而 int 在 64 位中是不够的。
-
@SergeyA
0提供为ctrl,而不是func。 -
很确定是那些控制ID。它们似乎被定义为与 NM_FIRST 的偏移量,即 0u。 (见下面的答案)为什么?因为微软讨厌我。我不认为我使用的是 64 位,但我最好去检查一下。
标签: c++ visual-studio