在现代C++应用程序中使用Win32代码时,是否应该使用正确的转换?

App*_*ood 4 c++ winapi visual-c++

例如,可以在整个MSDN文档中找到以下演员:

(LPTSTR)&lpMsgBuf
Run Code Online (Sandbox Code Playgroud)

我应该把它转换成:

static_cast<LPTSTR>(&lpMsgBuf);
Run Code Online (Sandbox Code Playgroud)

或者我应该留下所有惯用的C-esque Win32部分,因为它们通常在文档中找到,并为我的其余代码保存更惯用的C++样式/用法?

tpd*_*pdi 12

引入新风格的演员有一个原因:它们更安全,更具说明性/自我评论,更容易看到,更容易上映.

所以使用它们.

通过更多的解释,我们的意思是你不能只是投射到什么,你必须说你为什么要投射(我在一个继承层次结构(dynamic_cast)中投射,我的演员是实现定义的并且可能不是可移植的(reinterpret_cast) ,我正在抛弃constness(const_cast)等.

他们故意长而丑陋,以便演员跳出读者(并阻止采用过多演员的编程风格).

它们更安全,因为,例如,如果没有明确地这样做,你就不能抛弃const.


Jos*_*ley 6

我没有使用旧式强制转换或新式强制转换,而是利用C++的运算符重载来添加带有正确类型参数的Windows API函数的内联重载版本.(只要这是为新开发人员记录的,它希望不会太混乱.)

例如,FormatMessage第五个参数通常是一个LPTSTR,但如果传递该FORMAT_MESSAGE_ALLOCATE_BUFFER标志,则第五个参数是指向LPTSTR的指针.所以我定义了一个这样的函数:

inline DWORD WINAPI FormatMessage(
  __in      DWORD dwFlags,
  __in_opt  LPCVOID lpSource,
  __in      DWORD dwMessageId,
  __in      DWORD dwLanguageId,
  __out     LPTSTR *lpBuffer,
  __in      DWORD nSize,
  __in_opt  va_list *Arguments
) {
    assert(dwFlags & FORMAT_MESSAGE_ALLOCATE_BUFFER);
    return FormatMessage(dwFlags, lpSource, dwMessageId, dwLanguageId, static_cast<LPTSTR>(&lpBuffer), nSize, Arguments);
}
Run Code Online (Sandbox Code Playgroud)