2011-11-21 79 views
2

我在寫一些C代碼並使用Windows API。我想知道是否在任何情況下都可以使用明顯相同但名稱不同的類型。例如,當將TCHAR *傳遞給strcmp()時,其預計爲const char *。我應該這樣做,假設我想寫嚴格,並在任何方式正確的C,strcmp((const char *)my_tchar_string, "foo")總是在C中轉換變量是否是一個好習慣?

回答

7

不要。但也不要使用strcmp()而是使用_tcscmp()(或者甚至是安全的替代品)。

_tcs*表示一組完整的C運行時(字符串)函數,根據預處理器如何翻譯TCHAR將表現正確。

關於安全替代方法,請查找尾隨函數_s,並以C運行時命名爲經典字符串函數。還有一組函數返回HRESULT,但它與C運行時不兼容。

1

鑄造通常是一個壞主意。當你不需要的時候施放是可怕的練習。

想想如果您更改要投射的變量的類型會發生什麼?假設在將來某個日期,您將my_tchar_string更改爲wchar_t*而不是char*。你的代碼仍然會編譯,但行爲不正確。

你的一個主要目標時,編寫C代碼是儘量減少你的代碼類型轉換的數量。

0

我的建議是隻避免TCHAR(以及相關的功能)完全。他們的真正目的是讓一個代碼庫可以本地編譯爲16位或32位版本的Windows--但是16位版本的Windows早已不復存在,並且有了這樣編寫代碼的真正原因。

如果您需要/需要支持寬字符,請執行此操作。如果你只有窄/多字節的字符,那就這樣做。至少IME,試圖坐在柵欄上,做一些通常意味着你最終沒有做好。這還意味着將測試量大致增加一倍,甚至無需將您提供給用戶的功能提高一倍。

相關問題