我在寫一些C代碼並使用Windows API。我想知道是否在任何情況下都可以使用明顯相同但名稱不同的類型。例如,當將TCHAR *
傳遞給strcmp()
時,其預計爲const char *
。我應該這樣做,假設我想寫嚴格,並在任何方式正確的C,strcmp((const char *)my_tchar_string, "foo")
?總是在C中轉換變量是否是一個好習慣?
2
A
回答
7
不要。但也不要使用strcmp()
而是使用_tcscmp()
(或者甚至是安全的替代品)。
_tcs*
表示一組完整的C運行時(字符串)函數,根據預處理器如何翻譯TCHAR
將表現正確。
關於安全替代方法,請查找尾隨函數_s
,並以C運行時命名爲經典字符串函數。還有一組函數返回HRESULT
,但它與C運行時不兼容。
4
不,因爲TCHAR
並不總是等於char
。您應該選擇一個與TCHAR
配合使用的功能,而不是鑄造。見http://msdn.microsoft.com/en-us/library/e0z9k731(v=vs.71).aspx
1
鑄造通常是一個壞主意。當你不需要的時候施放是可怕的練習。
想想如果您更改要投射的變量的類型會發生什麼?假設在將來某個日期,您將my_tchar_string
更改爲wchar_t*
而不是char*
。你的代碼仍然會編譯,但行爲不正確。
你的一個主要目標時,編寫C代碼是儘量減少你的代碼類型轉換的數量。
0
我的建議是隻避免TCHAR
(以及相關的功能)完全。他們的真正目的是讓一個代碼庫可以本地編譯爲16位或32位版本的Windows--但是16位版本的Windows早已不復存在,並且有了這樣編寫代碼的真正原因。
如果您需要/需要支持寬字符,請執行此操作。如果你只有窄/多字節的字符,那就這樣做。至少IME,試圖坐在柵欄上,做一些通常意味着你最終沒有做好。這還意味着將測試量大致增加一倍,甚至無需將您提供給用戶的功能提高一倍。
相關問題
- 1. 總是等待任務完成是否是一種好習慣?
- 2. 在playframework中設置像這樣的GLOBAL變量是否是一個好習慣?
- 3. typedef變量在同一類中。這是一個好習慣嗎?
- 4. 在populator中使用轉換器是一個好習慣嗎?
- 5. 在WPF(MVVM)中建立Model是否是一個好習慣?
- 6. 在ThreadPoolExecutor中設置allowCoreThreadTimeOut()是否是一個好習慣?
- 7. 在python中製作嵌套類是否是一個好習慣?
- 8. 爲句柄寫一個getter是否是一個好習慣?
- 9. 在$角度使用$ parent是否是一個好習慣?
- 10. 從c中的函數返回指針是否是好習慣?
- 11. 傳遞Ninject內核是否是一個好習慣?
- 12. 構建集合緩存是否是一個好習慣?
- 13. 擴展Struts框架的FilterDispatcher是否是一個好習慣?
- 14. 從PHP/Mysql函數返回HTML是否是一個好習慣?
- 15. 重寫ServletContextListener的實現是否是一個好習慣?
- 16. 修改html id是否是一個好習慣?
- 17. 爲CQRS實現打包Masstransit是否是一個好習慣?
- 18. 用戶Fragment.setRetainInstance不處理娛樂是否是一個好習慣?
- 19. 使用float來定位元素是否是一個好習慣?
- 20. 使用active_model_serializer和Jbuilder是否是一個好習慣?
- 21. 延長zf2控制器兩次是否是一個好習慣?
- 22. 擴展NSError是否是一個好習慣
- 23. 初始化一個變量爲零是好習慣嗎?
- 24. 在另一個線程中使用線程是否是一個好習慣?
- 25. 將主參數存儲到全局變量是否是一種好習慣?
- 26. 這是一個很好的習慣嗎?
- 27. Object.create({}):這是一個好習慣嗎?
- 28. PhpUnit是一個很好的習慣嗎?
- 29. 從函數中打印bool值是否是一種好習慣?
- 30. 在我的AppDelegate中保留一個CLLocationManager是否是一種好習慣?