<@乌龟:>从c#到c++的一些容易出现的困惑(2)
2009-08-20 08:03
363 查看
武汉的天气太热了.很早就逼得人起床-_-
上次写了一点从c#到c++容易出现的一些问题, 今天接着写一点, 上一篇文章主要把精力集中在.H文件,命名空间等工程所需要的一些地方,今天主要说一说从语言的角度来说一些类型与c#迥然不同的用法.
1. 枚举类型:
c++的枚举类型用法非常的灵活,但是也带来一些很不方便的地方.下面是一段正常的c++的枚举类型的使用:
从代码上可以看到,首先是定义了一个Emotion的枚举,在使用的时候,既可以在枚举类型的前面加上枚举的说明符,又可以不加上.得到的结果是一样的.
这里要注意一下13行的#define,枚举类型不仅可以再enum{}中定义,还可以再花括号之外定义.这种方法我是在d3d的头文件定义中看到的.
下面再看一段代码
按c#的理解来说,这段代码应该是完全没有问题的,Emotion和Test属于两个不同的域,但是c++没有枚举域这个概念,其实c++的枚举定义更像是一堆的#define,上面的代码有编译错误,告诉我有Happy枚举量重定义. 上面的代码可以按这样的方式来理解:
但是不同的,这段代码就没有编译错误了,只是一个warning.
2. WCHAR, CHAR, TCHAR以及相关的问题.
这个问题其实网上有很多的文章来详细的描述,我只是谈谈我个人的一些感想以及总结一下网上查到的内容.
对于c++可没有这么多的字符种类.一个String就可以包含所有的字符,而且还不需要进行转换.但是对于c++就不一样了,c++由于兼容c语言的一些特性,char类型就是代码ASCII码里面的字符,如果要描述中文,日文等等字符就需要对原来的char类型进行扩展,也就是UNICODE码,在c++里面被称为wchar_t类型.
对于VC,认为wchar_t看起来不好看(我不知道最后的't'是什么意思)于是就将wchar_t定义成了WCHAR,其实两者之间是等价的.
对于对WCHAR*字符串进行赋值的时候,注意要加上一个L宏,也就比如
TCHAR是一种为了统一两者的命名.下面这两句话可以很清楚的说明问题.
定义了_UNICODE:typedef wchar_t TCHAR ;
没有定义_UNICODE: typedef char TCHAR ;
TCHAR的宏是_T,TEXT,_TEXT,三者是等价的.
下面给出一些常用的字符串函数的不同定义(针对WCHAR与char)
上次写了一点从c#到c++容易出现的一些问题, 今天接着写一点, 上一篇文章主要把精力集中在.H文件,命名空间等工程所需要的一些地方,今天主要说一说从语言的角度来说一些类型与c#迥然不同的用法.
1. 枚举类型:
c++的枚举类型用法非常的灵活,但是也带来一些很不方便的地方.下面是一段正常的c++的枚举类型的使用:
[code] # 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的头文件定义中看到的.
下面再看一段代码
[code]enum Emotion
{
Happy = 0,
Sad = 1,
Exciting = 2,
};
enum Test
{
Happy = 5;
Others = 6;
};
按c#的理解来说,这段代码应该是完全没有问题的,Emotion和Test属于两个不同的域,但是c++没有枚举域这个概念,其实c++的枚举定义更像是一堆的#define,上面的代码有编译错误,告诉我有Happy枚举量重定义. 上面的代码可以按这样的方式来理解:
[code] #define Happy 0;
#define Sad 1;
#define Exciting 2;
#define Happy 5;
#define Others 6;
但是不同的,这段代码就没有编译错误了,只是一个warning.
2. WCHAR, CHAR, TCHAR以及相关的问题.
这个问题其实网上有很多的文章来详细的描述,我只是谈谈我个人的一些感想以及总结一下网上查到的内容.
对于c++可没有这么多的字符种类.一个String就可以包含所有的字符,而且还不需要进行转换.但是对于c++就不一样了,c++由于兼容c语言的一些特性,char类型就是代码ASCII码里面的字符,如果要描述中文,日文等等字符就需要对原来的char类型进行扩展,也就是UNICODE码,在c++里面被称为wchar_t类型.
对于VC,认为wchar_t看起来不好看(我不知道最后的't'是什么意思)于是就将wchar_t定义成了WCHAR,其实两者之间是等价的.
对于对WCHAR*字符串进行赋值的时候,注意要加上一个L宏,也就比如
[code] WCHAR* wStr = L"Hello World";
TCHAR是一种为了统一两者的命名.下面这两句话可以很清楚的说明问题.
定义了_UNICODE:typedef wchar_t TCHAR ;
没有定义_UNICODE: typedef char TCHAR ;
TCHAR的宏是_T,TEXT,_TEXT,三者是等价的.
下面给出一些常用的字符串函数的不同定义(针对WCHAR与char)
[code] 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函数.
给大家一个连接,上面讲的比较清楚了
http://www.cppblog.com/sunraiing9/archive/2007/03/21/20281.html
相关文章推荐
- <@乌龟:>从c#到c++的一些容易出现的困惑(1)
- C#的一些小技术 <1>
- iOS开发中,对请求数据出现<null>的一些简单处理
- <From C++ To C#> 更强大的值类型
- 在C#里调用C++的dll时需要注意的一些问题<转>
- <转>c#调用C++DLL类型转换
- <转>C# 4.0 为泛型编程引入了 协变 和 逆变 支持,这是个不错的福利,能省掉以往的一些麻烦。不过当前(Beta2)仅支持泛型接口和泛型委托。
- <@乌龟:>C++/CLI语言Specification阅读笔记(1)
- <android> 常用但容易忘记的一些代码和技巧 汇总(个人笔记)
- <C#> 泛型、委托和一些易混淆的定义(1)
- <From C++ To C#> 做猜数一个小游戏
- private:c/c++ 我的一些容易出错的地方 =>持续更新
- <转>C# 4.0 为泛型编程引入了 协变 和 逆变 支持,这是个不错的福利,能省掉以往的一些麻烦。不过当前(Beta2)仅支持泛型接口和泛型委托。
- <From C++ To C#> 我们先定义一些局部变量
- C# 调用C++dll出现的问题。
- <3>C++ Primer字面值常量
- <constructor-arg>标签不可出现属性“name”可能是你spring版本过低
- <转>C++学得再好,也无法凭这个找到好工作
- c#中的一些容易混淆的概念
- <<C++ Primer>>中文版 重载箭头运算符的理解