自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

從語(yǔ)言的角度看C#到C++的困惑

開(kāi)發(fā) 后端
本文從語(yǔ)言的角度講述了從c#到c++的一些容易出現(xiàn)的困惑,希望對(duì)大家有所幫助。

上次寫了一點(diǎn)從c#到c++容易出現(xiàn)的一些問(wèn)題, 今天接著寫一點(diǎn), 上一篇文章主要把精力集中在.H文件,命名空間等工程所需要的一些地方,今天主要說(shuō)一說(shuō)從語(yǔ)言的角度來(lái)說(shuō)一些類型與c#迥然不同的用法.

C#到C++的困惑之一:枚舉類型

c++的枚舉類型用法非常的靈活,但是也帶來(lái)一些很不方便的地方.下面是一段正常的c++的枚舉類型的使用: 

  1. # include < string>  
  2.  # include < iostream>  
  3.     
  4.  using namespace std;  
  5.     
  6.  enum Emotion  
  7.  {  
  8.      Happy = 0,  
  9.      Sad = 1,  
  10.      Exciting = 2,  
  11.  };  
  12.     
  13.  #define Love Emotion(4);  
  14.     
  15.  void main()  
  16.  {  
  17.      Emotion emotion = Love;  
  18.      Emotion emotion2 = Emotion::Exciting;  
  19.     
  20.      cout < <  (int)emotion < <  endl;  
  21.      cout < <  (int)emotion2 < <  endl;  
  22.  } 

從代碼上可以看到,首先是定義了一個(gè)Emotion的枚舉,在使用的時(shí)候,既可以在枚舉類型的前面加上枚舉的說(shuō)明符,又可以不加上.得到的結(jié)果是一樣的.

這里要注意一下13行的#define,枚舉類型不僅可以再enum { }中定義,還可以再花括號(hào)之外定義.這種方法我是在d3d的頭文件定義中看到的.

下面再看一段代碼

  1. enum Emotion  
  2. {  
  3.     Happy = 0,  
  4.     Sad = 1,  
  5.     Exciting = 2,  
  6. };  
  7.    
  8. enum Test  
  9. {  
  10.    Happy = 5;  
  11.    Others = 6;  
  12. }; 

按c#的理解來(lái)說(shuō),這段代碼應(yīng)該是完全沒(méi)有問(wèn)題的,Emotion和Test屬于兩個(gè)不同的域,但是c++沒(méi)有枚舉域這個(gè)概念,其實(shí)c++的枚舉定義更像是一堆的#define,上面的代碼有編譯錯(cuò)誤,告訴我有Happy枚舉量重定義. 上面的代碼可以按這樣的方式來(lái)理解:

  1. #define Happy 0;  
  2. #define Sad 1;  
  3. #define Exciting 2;  
  4.    
  5. #define Happy 5;  
  6. #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宏,也就比如

  1. 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)

  1. size_t strlen( const char *string );  
  2. size_t wcslen( const wchar_t *string );  
  3.    
  4. char *strcpy( char *strDestination, const char *strSource );  
  5. wchar_t *wcscpy( wchar_t *strDestination, const wchar_t *strSource );  
  6.    
  7. char *strcat( char *strDestination, const char *strSource );  
  8. wchar_t *wcscat( wchar_t *strDestination, const wchar_t *strSource );  
  9.    
  10. int strcmp( const char *string1, const char *string2 );  
  11. int wcscmp( const wchar_t *string1, const wchar_t *string2 ); 

最后說(shuō)說(shuō)寬字符與普通字符之間的轉(zhuǎn)化:

一般大家使用現(xiàn)成的函數(shù)MultiByteToWideChar,與WideCharToMultiByte函數(shù).   

好了,從c#到c++的一些容易出現(xiàn)的困惑就講到這里。

【編輯推薦】

  1. 總結(jié)C#哈希表的用法
  2. 不一樣的入門:看C# Hello World的17種寫法
  3. 什么是WMI?及其示例
  4. 從C#到C++容易出現(xiàn)的問(wèn)題解答
  5. 淺議.NET、ASP.NET和C#的關(guān)系
責(zé)任編輯:book05 來(lái)源: cnblogs
相關(guān)推薦

2009-08-25 17:46:31

C#多態(tài)

2009-08-20 15:54:48

從C#到C++

2009-09-04 17:34:11

C#CC++

2021-05-06 10:33:30

C++Napiv8

2014-05-15 16:33:05

C++CLI調(diào)用C#

2015-06-25 11:21:33

C++Objective-C

2021-12-06 23:00:36

CC++編程語(yǔ)言

2011-07-13 17:42:32

CC++

2011-07-13 17:08:02

CC++

2011-07-13 16:48:55

CC++

2010-01-21 16:08:26

C++語(yǔ)言

2010-01-15 17:38:37

C++語(yǔ)言

2025-02-14 00:00:20

C#C/C++語(yǔ)言

2010-11-08 10:20:18

2014-04-17 10:37:43

C++.NET Native

2010-01-15 18:35:25

C++的類

2011-01-05 11:12:34

C++

2024-01-22 11:33:17

C++編程語(yǔ)言開(kāi)發(fā)

2009-09-02 17:10:45

C#語(yǔ)言入門

2022-03-25 09:57:18

C++Rust語(yǔ)言
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)