从语言的角度看C 从语言的角度赏析句子答题技巧
创始人
2024-05-06 01:41:10
0

上次写了一点从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#的关系

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...
《非诚勿扰》红人闫凤娇被曝厕所... 【51CTO.com 综合消息360安全专家提醒说,“闫凤娇”、“非诚勿扰”已经被黑客盯上成为了“木...
2012年第四季度互联网状况报... [[71653]]  北京时间4月25日消息,据国外媒体报道,全球知名的云平台公司Akamai Te...