從語(yǔ)言的角度看C#到C++的困惑
上次寫了一點(diǎn)從c#到c++容易出現(xiàn)的一些問(wèn)題, 今天接著寫一點(diǎn), 上一篇文章主要把精力集中在.H文件,命名空間等工程所需要的一些地方,今天主要說(shuō)一說(shuō)從語(yǔ)言的角度來(lái)說(shuō)一些類型與c#迥然不同的用法.
C#到C++的困惑之一:枚舉類型
c++的枚舉類型用法非常的靈活,但是也帶來(lái)一些很不方便的地方.下面是一段正常的c++的枚舉類型的使用:
- # include < string>
- # include < iostream>
- using namespace std;
- enum Emotion
- {
- Happy = 0,
- Sad = 1,
- Exciting = 2,
- };
- #define Love Emotion(4);
- void main()
- {
- Emotion emotion = Love;
- Emotion emotion2 = Emotion::Exciting;
- cout < < (int)emotion < < endl;
- cout < < (int)emotion2 < < endl;
- }
從代碼上可以看到,首先是定義了一個(gè)Emotion的枚舉,在使用的時(shí)候,既可以在枚舉類型的前面加上枚舉的說(shuō)明符,又可以不加上.得到的結(jié)果是一樣的.
這里要注意一下13行的#define,枚舉類型不僅可以再enum { }中定義,還可以再花括號(hào)之外定義.這種方法我是在d3d的頭文件定義中看到的.
下面再看一段代碼
- enum Emotion
- {
- Happy = 0,
- Sad = 1,
- Exciting = 2,
- };
- enum Test
- {
- Happy = 5;
- Others = 6;
- };
按c#的理解來(lái)說(shuō),這段代碼應(yīng)該是完全沒(méi)有問(wèn)題的,Emotion和Test屬于兩個(gè)不同的域,但是c++沒(méi)有枚舉域這個(gè)概念,其實(shí)c++的枚舉定義更像是一堆的#define,上面的代碼有編譯錯(cuò)誤,告訴我有Happy枚舉量重定義. 上面的代碼可以按這樣的方式來(lái)理解:
- #define Happy 0;
- #define Sad 1;
- #define Exciting 2;
- #define Happy 5;
- #define Others 6;
但是不同的,這段代碼就沒(méi)有編譯錯(cuò)誤了,只是一個(gè)warning.
C#到C++的困惑之二:WCHAR, CHAR, TCHAR以及相關(guān)的問(wèn)題.
這個(gè)問(wèn)題其實(shí)網(wǎng)上有很多的文章來(lái)詳細(xì)的描述,我只是談?wù)勎覀€(gè)人的一些感想以及總結(jié)一下網(wǎng)上查到的內(nèi)容.
對(duì)于c++可沒(méi)有這么多的字符種類.一個(gè)String就可以包含所有的字符,而且還不需要進(jìn)行轉(zhuǎn)換.但是對(duì)于c++就不一樣了,c++由于兼容c語(yǔ)言的一些特性,char類型就是代碼ASCII碼里面的字符,如果要描述中文,日文等等字符就需要對(duì)原來(lái)的char類型進(jìn)行擴(kuò)展,也就是UNICODE碼,在c++里面被稱為wchar_t類型.
對(duì)于VC,認(rèn)為wchar_t看起來(lái)不好看(我不知道最后的't'是什么意思)于是就將wchar_t定義成了WCHAR,其實(shí)兩者之間是等價(jià)的.
對(duì)于對(duì)WCHAR*字符串進(jìn)行賦值的時(shí)候,注意要加上一個(gè)L宏,也就比如
- WCHAR* wStr = L"Hello World";
TCHAR是一種為了統(tǒng)一兩者的命名.下面這兩句話可以很清楚的說(shuō)明問(wèn)題.
定義了_UNICODE: typedef wchar_t TCHAR ;
沒(méi)有定義_UNICODE: typedef char TCHAR ;
TCHAR的宏是_T,TEXT,_TEXT,三者是等價(jià)的.
下面給出一些常用的字符串函數(shù)的不同定義(針對(duì)WCHAR與char)
- size_t strlen( const char *string );
- size_t wcslen( const wchar_t *string );
- char *strcpy( char *strDestination, const char *strSource );
- wchar_t *wcscpy( wchar_t *strDestination, const wchar_t *strSource );
- char *strcat( char *strDestination, const char *strSource );
- wchar_t *wcscat( wchar_t *strDestination, const wchar_t *strSource );
- int strcmp( const char *string1, const char *string2 );
- int wcscmp( const wchar_t *string1, const wchar_t *string2 );
最后說(shuō)說(shuō)寬字符與普通字符之間的轉(zhuǎn)化:
一般大家使用現(xiàn)成的函數(shù)MultiByteToWideChar,與WideCharToMultiByte函數(shù).
好了,從c#到c++的一些容易出現(xiàn)的困惑就講到這里。
【編輯推薦】