2011-02-08 42 views
7

我是C++編程新手,來自Java和C#背景。我被#定義術語的增殖不解先從最基礎的:爲什麼有一個定義_t​​main的宏?

#define _tmain wmain 

當我第一次學會了C時代的一知半解以前,主要功能是:

int main(int argc, char *argv[]) 

在Visual C++項目我創建的,它提出的主要功能:

int _tmain(int argc, _TCHAR* argv[]) 

我只是想知道爲什麼是一個名稱的翻譯從wmain_tmain需要的?爲什麼不使用原始的C main函數原型?

一般來說,似乎有很多#define重命名的東西,看起來很清楚開始,看起來更神祕和不太清楚的東西(我的意思是wmain_tmain ??)。

感謝您容忍可能是一個非常明顯的問題。

+7

這是Windows特有的東西,它與標準C++(也不是C)無關。他們(微軟)有一個可怕的命名方案的壞習慣,並且不必要地使事情複雜化。 – 2011-02-08 18:51:27

+2

曾幾何時,有人認爲這是一個很好的主意,可以幫助人們使用wchar_t將舊版本的Windows版本從char更新爲新版本。它不是,現在它只是混淆了人們! – 2011-02-08 23:13:44

+1

相關:http://stackoverflow.com/questions/234365/is-tchar-still-relevant – dan04 2011-02-10 05:20:21

回答

13

這是一個Visual C++特有的功能,它不是C++的一部分。

大多數的Windows API函數有兩種版本:一種是在W結束,這是與寬字符字符串(wchar_t字符串)和那些結束A,這對於窄字符串使用用途(char串)。實際的Windows API「函數」沒有任何後綴,並且根據設置將其定義爲擴展到正確版本的宏。

T的名字(例如_TCHAR_tmain)是爲了同樣的目的:他們是擴大到正確的名稱取決於你的編譯設置,所以wchar_twmain寬字符支持,或charmain爲窄字符宏支持。

想法是,如果您使用字符類型不可知名稱(T名稱)編寫代碼,則可以編譯代碼以使用窄字符(ASCII)或寬字符(Unicode)而不更改它。代價是你的代碼不太便於攜帶。

5

因爲微軟決定,最好的辦法爲Unicode支持添加到C++是添加TCHAR類型,它已經#defined要麼charwchar_t根據項目屬性>配置屬性>常規>字符集的值。 _tmain也被定義爲main(需要char s)或wmain(需要wchar_t s),具體取決於該設置。

相關問題