《深入浅出MFC》中的一个类型转换问题

GreenCode 2004-09-16 11:04:06
第3章Persistence一节中,有这样一段代码
CRuntimeClass* PASCAL CRuntimeClass::Load(CArchive& ar, UINT* pwSchemaNum)
{
WORD nLen;
char szClassName[64];
CRuntimeClass* pClass;
ar >> (WORD&)(*pwSchemaNum) >> nLen;
if (nLen >= sizeof(szClassName) || ar.Read(szClassName, nLen) != nLen)
return NULL;
szClassName[nLen] = '\0';
for (pClass = pFirstClass; pClass != NULL; pClass = pClass->m_pNextClass)
{
if (lstrcmp(szClassName, pClass->m_lpszClassName) == 0)
return pClass;
}
return NULL;
}
第4行中把*pwSchemaNum强制转换为WORD类型的引用,在C++中第一次看到这样的用法,联想到C#的boxing机制...难道直接写成(WORD)(*pwSchemaNum)不可以吗
有知道的高手请讲讲这种转换的目的和内部机制
...全文
195 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
bluejugar 2004-09-18
  • 打赏
  • 举报
回复
MFC已经过时了.
其思维已经过时了十年.
其代码已经过时了五年.(从学习语言的角度).
kwib799 2004-09-18
  • 打赏
  • 举报
回复
搂住你哪有 深入浅出 MFC 的配套光盘么?
急需阿!
GreenCode 2004-09-17
  • 打赏
  • 举报
回复
用Dev-C++(4.9.9.0)试了一下
#include <stdio.h>

int main()
{
char a = 'A';
char *p = &a;
int i = (int)(*p);
int j = (int&)(*p);
printf("%d", i);
printf("\n");
printf("%d", j);
}
i的值,毫无疑问是65
j的值是587102145,转换为十六进制是0x22FFB041,最后一个字节(41)正好是65
感觉转换为某类型和转换为某类型的引用还是有些内在的差异
在VC下反汇编,果然有细微的差别
5: char a = 'A';
00401028 mov byte ptr [ebp-4],41h
6: char *p = &a;
0040102C lea eax,[ebp-4]
0040102F mov dword ptr [ebp-8],eax
7: int i = (int)(*p);
00401032 mov ecx,dword ptr [ebp-8]
00401035 movsx edx,byte ptr [ecx]
00401038 mov dword ptr [ebp-0Ch],edx
8: int j = (int&)(*p);
0040103B mov eax,dword ptr [ebp-8]
0040103E mov ecx,dword ptr [eax]
00401040 mov dword ptr [ebp-10h],ecx
个人认为,将A类型的左值转换为B类型的话,会考虑到符号扩展的问题,特别是B类型的位宽大于A类型,但如果是从A类型转换为B类型的引用,会把堆栈中的raw data也算进去
xuyisun 2004-09-17
  • 打赏
  • 举报
回复
学习C++不一定学习MFC,
学习MFC一定要学习C++;
要想真正做一个程序,
还得学习VC或者别的开发环境。
daylove 2004-09-17
  • 打赏
  • 举报
回复
顺便问一下,学习c++是否一定要把学习MFC呢 ????
wangyangcheng 2004-09-17
  • 打赏
  • 举报
回复
UINT* pwSchemaNumr -> (WORD&)(*pwSchemaNum)

将pwSchemaNum指针从指向UINT改为指向WORD&类型。

hcj2002 2004-09-17
  • 打赏
  • 举报
回复
mfc的类库确实有一些令人费解的地方。

^_^
daylove 2004-09-17
  • 打赏
  • 举报
回复
进来学习的,顺便顶一下
nabie 2004-09-17
  • 打赏
  • 举报
回复
(WORD&)(*pwSchemaNum)

这条语句的意思就是把 pwSchemaNum 所指向的地址的内容当作一个 WORD 引用来使用。

0000 12 23 45 67 78 AB 2D C0 47 ...
^^
假设 pwSchemaNum 的值是 0x0004,
这条语句的意思是 0xC02DAB78 是一个 WORD 的地址
freefalcon 2004-09-16
  • 打赏
  • 举报
回复
感觉多此一举
nicknide 2004-09-16
  • 打赏
  • 举报
回复
调试了一下,发现汇编的结果是一致的,没有任何不同的地方,楼上如果不确信的话,可以自己动手调试运行一下,看看结果有什么不同的地方,然后再来讨论。

64,649

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧