我正在编写一些C代码并使用Windows API。我想知道是否有任何好的做法来投射明显相同的类型,但有不同的名称?例如,将TCHAR *
传递给strcmp()
时,需要const char *
。我应该这样做,假设我想写严格并以各种方式纠正C,strcmp((const char *)my_tchar_string, "foo")
?
答案 0 :(得分:7)
别。但也不要使用strcmp()
而是_tcscmp()
(甚至是安全的替代品)。
_tcs*
表示一整套C运行时(字符串)函数,它们将根据预处理器TCHAR
的翻译方式正确运行。
关于安全替代方案,查找具有尾随_s
的函数,并以C运行时命名为经典字符串函数。还有另一组函数返回HRESULT
,但它与C运行时不兼容。
答案 1 :(得分:4)
不,抛弃它是不安全的,因为TCHAR
并不总是等于char
。您应该选择一个与TCHAR
一起使用的函数,而不是强制转换。见http://msdn.microsoft.com/en-us/library/e0z9k731(v=vs.71).aspx
答案 2 :(得分:1)
施法通常是一个坏主意。当你不需要时施放是一种可怕的做法。
想一想如果更改要投射的变量的类型会发生什么?假设您将来某个日期将my_tchar_string
更改为wchar_t*
而不是char*
。您的代码仍会编译但行为不正确。
编写C代码时,您的主要目标之一是尽量减少代码中的强制转换数量。
答案 3 :(得分:0)
我的建议是完全避免TCHAR
(及相关功能)。他们的真正意图是允许单个代码库本地编译为16位或32位版本的Windows - 但是16位版本的Windows早已不复存在,并且与他们一起编写这样的代码的真正原因
如果您需要/需要支持宽字符,请执行此操作。如果您只使用窄/多字节字符,那就这样做。至少IME,试图坐在围栏上并做一些两者通常意味着你最终没有做好任何一个。它还意味着大致加倍的测试量,甚至不会使您提供给用户的功能加倍。