总是在C中输出变量是一种好习惯吗?

时间:2011-11-21 18:34:16

标签: c winapi coding-style casting

我正在编写一些C代码并使用Windows API。我想知道是否有任何好的做法来投射明显相同的类型,但有不同的名称?例如,将TCHAR *传递给strcmp()时,需要const char *。我应该这样做,假设我想写严格并以各种方式纠正C,strcmp((const char *)my_tchar_string, "foo")

4 个答案:

答案 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,试图坐在围栏上并做一些两者通常意味着你最终没有做好任何一个。它还意味着大致加倍的测试量,甚至不会使您提供给用户的功能加倍。