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.
我没有使用旧式强制转换或新式强制转换,而是利用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)