【发布时间】:2014-03-20 20:40:16
【问题描述】:
标准数据类型还是 Windows 数据类型?
我会使用 Windows 数据类型来使我的代码与 Win32 API 保持一致。
另一方面,我会更多地使用标准数据类型来防止编码错误。
- 使用 nullptr 而不是 NULL 可以防止为实际上不采用指针类型的参数传递 NULL 的不良风格。
- 想象一个 Win32 API 函数,它出于某种无意义的原因采用 LPTSTR,但实际上将其视为 LPTCSTR。你有一个 std::string,然后执行 (LPTSTR)(s.c_str())。一切都很好,直到您切换到 W 版本的 Win32 API 函数。该程序编译是因为强制转换成功,但可能会发生一些不好的事情。如果你已经完成了 (char*)(s.c_str()),编译器就会捕捉到这一点。
使用标准数据类型似乎更安全,但也感觉像是去参加一个全黑的“穿白”派对。
这里应该决定什么?
【问题讨论】:
-
对于#2,我知道很少有 API 采用
LPTSTR而不期望它应该是可变的。它们存在,但谢天谢地,它非常罕见。如果您想完全符合std::vector<TCHAR> tmp(s.begin(), s.end()); tmp.push_back(TCHAR());的标准,那么发送tmp.data()会起作用,但我同意有时保持完全合规会很痛苦。如果字符串的 char 类型与 TCHAR 不一致,则 temp 方法将正确编译失败。无论如何,我同意,并且不会 hard-c-ctyle cast。 -
You have a std::string, and do (LPTSTR)(s.c_str()).如果你这样做了,代码永远不会通过审查。 -
我认为这是一个很好的问题,可能会引发一些很好的讨论,但我认为 Stack Overflow 不是适合它的论坛。你会得到很多意见。
-
@PaulMcKenzie,没有。但有时程序员会犯错误,甚至审稿人也可能没有发现。
-
最好避免假设这些 typedef 具有某种魔力并且与编译器使用的类型不匹配。 LPTSTR 只是 char* ,因此不需要强制转换。等到变成 wchar_t* 的那一天是不明智的,30 亿客户已经等不及了。