[VC/MFC 基础类]VC编程经验总结

bluebohe 2003-10-27 11:03:38
加精
| 在VC的使用过程中,每个人或多或少都会遇到一些麻烦,而这些问题可能其他人也同样遇到过,或许还没能解决。当你发现问题根结所在时,兴奋之余,欢迎你告诉他人同类问题的解决之道。
大家如果有新的发现,请把你的编程经验收藏在这个帖子里吧!
该贴会被放在本版面专题中http://www.csdn.net/Subject/297/index.shtm

奖励办法:对于好的编程经验,贴主可以重新开贴,斑竹会将其加入精华或FAQ,奖励可用分(精华100分)、信誉分(FAQ主要问题解决人信誉分加5)
...全文
2167 158 打赏 收藏 举报
写回复
158 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
tiesuiyaa 2010-06-21
我很老实的
最初只是为了十个积分
看了贴之后是来学习的
  • 打赏
  • 举报
回复
颖哥儿 2010-06-17
呵呵,谢谢分享~~~
  • 打赏
  • 举报
回复
逸萌 2010-06-13
DING up 好 OK
  • 打赏
  • 举报
回复
xinercp 2010-06-10
mark
  • 打赏
  • 举报
回复
bluebohe 2003-11-23
这个帖子太大了,现在结贴
  • 打赏
  • 举报
回复
zillli 2003-11-22
我在学习VC,或者在阅读别人写的文章的时候,偶尔碰到下面很多有趣的,并且很奇怪的语句,整理起来,以备后忘.面采自很多兄弟的大作,不能一一列出,一起表示感谢。


一. 奇怪的宏定义
(1) #define for if(0); else for
按照c++标准,for中定义的变量的作用域应该只在for循环中有效,而VC却不行,比如这样定义是不对的
for(int i=0;i<90;i++)
{
...;
}

for(int i=0;i<90;i++) //重复定义i变量
{
...;
}

如果加上标题的那句,那么就可以了,就是让i作用域局限在else中.

(2)宏定义怪圈
#define wait_event(wq,condition) \
do{ \
if(condition) \
break; \
__wait_event(wq,condition); \
}while(0)


明明这句话只执行一次,为什么还还用do-while语句呢?

假设有这样一个宏定义
#define macro(condition) \
if(condition) dosomething();
现在在程序中这样使用这个宏:
if(temp)
macro(i);
else
doanotherthing();
一切看起来很正常,但是仔细想想。这个宏会展开成:
if(temp)
if(condition) dosomething();
else
doanotherthing();
这时的else不是与第一个if语句匹配,而是错误的与第二个if语句进行了匹配,编译通过了,但是运行的结果一定是错误的。
为了避免这个错误,我们使用do{….}while(0) 把它包裹起来,成为一个独立的语法单元,从而不会与上下文发生混淆。
同时因为绝大多数的编译器都能够识别do{…}while(0)这种无用的循环并进行优化,所以使用这种方法也不会导致程序的性能降低。

(3) #if(0)
........
#endif

这样是为了解释掉某段程序,而不影响其中的/*...*/的作用,便于调试

而/*.....*/是不能嵌套的,编译会出错.

(4)用下面语句实现数据转换。 i=(int)(f*100);
当f=11.40(米)时,i=1139(厘米);
当f=11.41(米)时,i=1140(厘米);
当f=12.32(米)时,i=1231(厘米);
当f=12.33(米)时,i=1232(厘米);
等等,很多数据的转换存在着“1误差”。
不过,大部分数据的转换是没有误差的,
如当f=11.39(米)时,i=1139(厘米);
当f=12.31(米)时,i=1231(厘米)。
如果改用以下方法实现数据转换,
“1误差”一样存在。
float ftemp;
ftemp=f*100;
i=(int)ftemp;
这里,ftemp是一局部变量(函数内定义)
或全局变量(函数外定义)。把f*100改成f*100.0,
“1误差”也存在。但是如果把ftemp
改成为类的属性变量(在类里定义),


(5)a[i]和i[a]
在程序里本应该用a[i],但i[a]竟然和a[i]输出的结果一样。为什么。今天把问题整理如下:
i[a]是标准语法。“[]”称为下标运算符,其语法为:
postfix_expression [ expression ]
其中“postfix_expression”和“expression”之中必须有一个是指针类型(或数组),而另一个是整型。
例如下面的程序是完全合法的:
int a[]={0,1,2,3,4};
printf("%d\n",3[a]);
下标运算符参与的表达式在求解时仅仅是做一个变换而已,将“postfix_expression [ expression ]”
改写为“ * ( postfix_expression + expression ) ”,因此a[3]和3[a]分别改写为*(a+3)和*(3+a),
可见二者是完全等价的。但注意不要用i[a]这种形式,因为它不符合日常习惯。
实验代码:
#include "stdafx.h"
#include "iostream.h"
int f();
int main(int argc, char* argv[])
{

int a[20]={1,2,3,4,5,6,7,8,9};
cout<<a[f()]<<endl;
cout<<f()[a]<<endl;
return 0;
}

int f()
{
return 4;
}

实验结果:
4
4
Press any key to continue

(6)int x;x;

这儿是个关于宏的问题,我曾用过ATL的串转换宏,包括W2A,开始有些东西我还不太明白。为了使用这些宏,必须在函数的开始处用USES_CONVERSION来初始化某些局部变量。用就用吧,但是看看这个宏的定义,它有类似下面的代码:

// 在atlconv.h文件中
#define USES_CONVERSION \
int _convert; _convert; \
UINT _acp = GetACP(); _acp; \
LPCWSTR _lpw; _lpw; \
LPCSTR _lpa; _lpa

为什么它们用“int x;x;”——这种后面跟着变量的声明?

很多人都碰到过这个令人困惑的问题,后来发现简单的答案是:禁止编译器的警告信息(warning)。如果单独有一行代码:
int x;
且从来没有使用过x,那么编译器汇报错“unreferenced local variable:x”,意思是未引用过的局部变量x,如果将警告信息的输出
调到最大。为了避免讨厌的警告,USES_CONVERSION引用声明的变量。

int x; // 声明
x; // 使用这个变量

在C++之前的时代,程序员有时在C中用函数形参做同样的事情来避免“unreferenced formal parameter”或其它的深奥费解的编译错误。

void MyFunc(int x, char y)
{
x;
y;

}

当然,现在用下面的代码可以更有效地完成同样的事情:

// 参数 x 不是用
void MyFunc(int /* x */)
{

}

  • 打赏
  • 举报
回复
csdmy 2003-11-22
mark
  • 打赏
  • 举报
回复
xpf_2000 2003-11-22
加密API不好用需要定义
_WIN32_WINNT
#define _WIN32_WINNT 0x0500
  • 打赏
  • 举报
回复
cutestar 2003-11-22
UP AND DOWN
  • 打赏
  • 举报
回复
wuwind 2003-11-21
;
  • 打赏
  • 举报
回复
fbmsf 2003-11-21
我只想强调一下汇编的重要!!
  • 打赏
  • 举报
回复
laker_tmj 2003-11-21
up learn
  • 打赏
  • 举报
回复
rockrabbit 2003-11-20
学习。
  • 打赏
  • 举报
回复
PageYi 2003-11-20

  • 打赏
  • 举报
回复
25xxx25 2003-11-20
  • 打赏
  • 举报
回复
Anikan 2003-11-20
"MFC"
  • 打赏
  • 举报
回复
warton 2003-11-19
up
  • 打赏
  • 举报
回复
MicoInNet 2003-11-19
mark
  • 打赏
  • 举报
回复
lastman001 2003-11-14
好贴呀
  • 打赏
  • 举报
回复
Ziox 2003-11-14
gz
  • 打赏
  • 举报
回复
加载更多回复
相关推荐
课程设计-基于C++的mfc框架的学生社团管理系统(源码+数据库+报告).zip 本系统实现的功能 本程序为单文档应用程序,主程序界面能实现查询社团信息、修改社团信息、删除社团信息、添加社团信息、入团、退团、用户登录、和用户管理功能其中修改社团信息、删除社团信息、添加社团信息和用户管理需要用户登录后才能使用,未登录就点击使用的会会弹出对话框显示您还没有登录,点击登录按钮会弹出用户登录对话框输入正确的用户名称和密码若验证成功则会显示登录成功并显示出您用有的权限高级管理员或者是普通管理员,高级管理员则可以对社团信息进行修改、删除、添加。点击入团按钮会弹出加入社团对话框,在对话框内填上相应的信息后点击确定成功加入后会有相关提示,若没有成功则有可能您输入的社团不存在,点击退团按钮弹出退出社团对话框,输入您要退出的社团名称和学号点击确定如果成功退出会显示成功的标志,否则的话就是您没有假如该社团活着您填的信息不完全。在主程序对话框中可以直接在控件内输入要修改的社团信息,然后点击修改按钮,分别输入控件中的内容然后点击添加按钮,若要添加的社团当前没有的话则添加成功,否则会失败。登录了以后点击用户管理按钮则会弹出用户管理对话框,在该对话框内可以修改用户密码,高级管理员还能注册新用户。
发帖
VC/MFC
加入

1.6w+

社区成员

VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
申请成为版主
帖子事件
创建了帖子
2003-10-27 11:03
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……