從語言的角度看C#到C++的困惑
上次寫了一點從c#到c++容易出現的一些問題, 今天接著寫一點, 上一篇文章主要把精力集中在.H文件,命名空間等工程所需要的一些地方,今天主要說一說從語言的角度來說一些類型與c#迥然不同的用法.
C#到C++的困惑之一:枚舉類型
c++的枚舉類型用法非常的靈活,但是也帶來一些很不方便的地方.下面是一段正常的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;
- }
從代碼上可以看到,首先是定義了一個Emotion的枚舉,在使用的時候,既可以在枚舉類型的前面加上枚舉的說明符,又可以不加上.得到的結果是一樣的.
這里要注意一下13行的#define,枚舉類型不僅可以再enum { }中定義,還可以再花括號之外定義.這種方法我是在d3d的頭文件定義中看到的.
下面再看一段代碼
- enum Emotion
- {
- Happy = 0,
- Sad = 1,
- Exciting = 2,
- };
- enum Test
- {
- Happy = 5;
- Others = 6;
- };
按c#的理解來說,這段代碼應該是完全沒有問題的,Emotion和Test屬于兩個不同的域,但是c++沒有枚舉域這個概念,其實c++的枚舉定義更像是一堆的#define,上面的代碼有編譯錯誤,告訴我有Happy枚舉量重定義. 上面的代碼可以按這樣的方式來理解:
- #define Happy 0;
- #define Sad 1;
- #define Exciting 2;
- #define Happy 5;
- #define Others 6;
但是不同的,這段代碼就沒有編譯錯誤了,只是一個warning.
C#到C++的困惑之二:WCHAR, CHAR, TCHAR以及相關的問題.
這個問題其實網上有很多的文章來詳細的描述,我只是談談我個人的一些感想以及總結一下網上查到的內容.
對于c++可沒有這么多的字符種類.一個String就可以包含所有的字符,而且還不需要進行轉換.但是對于c++就不一樣了,c++由于兼容c語言的一些特性,char類型就是代碼ASCII碼里面的字符,如果要描述中文,日文等等字符就需要對原來的char類型進行擴展,也就是UNICODE碼,在c++里面被稱為wchar_t類型.
對于VC,認為wchar_t看起來不好看(我不知道最后的't'是什么意思)于是就將wchar_t定義成了WCHAR,其實兩者之間是等價的.
對于對WCHAR*字符串進行賦值的時候,注意要加上一個L宏,也就比如
- WCHAR* wStr = L"Hello World";
TCHAR是一種為了統一兩者的命名.下面這兩句話可以很清楚的說明問題.
定義了_UNICODE: typedef wchar_t TCHAR ;
沒有定義_UNICODE: typedef char TCHAR ;
TCHAR的宏是_T,TEXT,_TEXT,三者是等價的.
下面給出一些常用的字符串函數的不同定義(針對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 );
最后說說寬字符與普通字符之間的轉化:
一般大家使用現成的函數MultiByteToWideChar,與WideCharToMultiByte函數.
好了,從c#到c++的一些容易出現的困惑就講到這里。
【編輯推薦】