warning C4244対策

これの対処方法を考えてみた。
まだまだ出るぞ、64bit移植性関連トラブル! SetWindowLongPtr APIの第3引数にLONG_PTR型を渡すと警告される!!

(1) SetWindowLongPtr専用に型を定義する
すぐ思いつく方法。美しくないけど、warningをゼロにする必要があるなら仕方ないかも。

#ifdef _WIN64
#define _LONG_PTR LONG_PTR
#else
#define _LONG_PTR LONG
#endif
...

SetWindowLongPtr( hwnd, index, (_LONG_PTR)p );

(2) SetWindowLongPtrを再定義する
SetWindowLongPtrがdefineされていることを前提に、undefする。
明示的にキャストしているので警告されなくなる。

#ifndef _WIN64
#undef SetWindowLongPtr
static __inline LONG_PTR SetWindowLongPtr(HWND hWnd, int nIndex, LONG_PTR dwNewLong)
{ return SetWindowLong(hWnd, nIndex, (LONG)dwNewLong); }
#endif
(3) pragmaではさむ
無効にしてから有効にする。
SetWindowLongPtrは戻り値もLONG_PTRなので、お勧めできない方法。
#pragma warning(disable:4244)

SetWindowLongPtr( hwnd, index, (LONG_PTR)p );

#pragma warning(3:4244)

ちなみに明示的な32bitへの切り捨てはPtrToUlong等を使用する必要があって、なんでwarningが出ないんだろうと思ったら、これらは

#ifdef _WIN64
#pragma warning(disable:4311)
...
__inline unsigned long PtrToUlong(void *p)
{ return (unsigned long)p; }
...
#pragma warning(3:4311)
#endif
という風に定義されていた。(2)と(3)はそのパクリ。