从语言的角度看C#到C++的困惑

开发 后端
本文从语言的角度讲述了从c#到c++的一些容易出现的困惑,希望对大家有所帮助。

上次写了一点从c#到c++容易出现的一些问题, 今天接着写一点, 上一篇文章主要把精力集中在.H文件,命名空间等工程所需要的一些地方,今天主要说一说从语言的角度来说一些类型与c#迥然不同的用法.

C#到C++的困惑之一:枚举类型

c++的枚举类型用法非常的灵活,但是也带来一些很不方便的地方.下面是一段正常的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.  } 

从代码上可以看到,首先是定义了一个Emotion的枚举,在使用的时候,既可以在枚举类型的前面加上枚举的说明符,又可以不加上.得到的结果是一样的.

这里要注意一下13行的#define,枚举类型不仅可以再enum { }中定义,还可以再花括号之外定义.这种方法我是在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#的理解来说,这段代码应该是完全没有问题的,Emotion和Test属于两个不同的域,但是c++没有枚举域这个概念,其实c++的枚举定义更像是一堆的#define,上面的代码有编译错误,告诉我有Happy枚举量重定义. 上面的代码可以按这样的方式来理解:

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

  1. WCHAR* wStr = L"Hello World"

TCHAR是一种为了统一两者的命名.下面这两句话可以很清楚的说明问题.

定义了_UNICODE:    typedef wchar_t TCHAR ;

没有定义_UNICODE: typedef char TCHAR ;

TCHAR的宏是_T,TEXT,_TEXT,三者是等价的.

下面给出一些常用的字符串函数的不同定义(针对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 ); 

最后说说宽字符与普通字符之间的转化:

一般大家使用现成的函数MultiByteToWideChar,与WideCharToMultiByte函数.   

好了,从c#到c++的一些容易出现的困惑就讲到这里。

【编辑推荐】

  1. 总结C#哈希表的用法
  2. 不一样的入门:看C# Hello World的17种写法
  3. 什么是WMI?及其示例
  4. 从C#到C++容易出现的问题解答
  5. 浅议.NET、ASP.NET和C#的关系
责任编辑:book05 来源: cnblogs
相关推荐

2009-08-25 17:46:31

C#多态

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调用C#

2015-06-25 11:21:33

C++Objective-C

2021-12-06 23:00:36

CC++编程语言

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++语言

2010-01-15 17:38:37

C++语言

2010-11-08 10:20:18

2014-04-17 10:37:43

C++.NET Native

2010-01-15 18:35:25

C++的类

2019-04-28 16:10:50

设计Redux前端

2024-01-22 11:33:17

C++编程语言开发

2009-09-02 17:10:45

C#语言入门

2011-01-05 11:12:34

C++

2016-03-30 09:56:07

c语言变量声明objectivec
点赞
收藏

51CTO技术栈公众号