说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

这个宏函数有点怪

编辑:说三道四文库 发布时间:2018-08-18 04:48
HTML文档下载 WORD文档下载 PDF文档下载
#define CommandB() {struct resbuf rB_cmd,rB_usr;\
acedGetVar("CMDECHO",&rB_cmd);\
rB_usr.restype=RTSHORT;\
rB_usr.resval.rint=(int)(0);\
acedSetVar("CMDCEHO",&rB_usr);
#define CommandE() acedSetVar("CMDECHO",&rB_cmd);\
};
为什么这个宏函数最后要加分号,且函数内部还有一个宏函数,这究竟是怎么回事,宏CommandE可在程序中单独使用吗?
这两个宏应该是配对使用,不能单独使用后者,
最后加分号,这样在使用的时候,可以不加分号

CommandB()
...
CommandE()
"可以"不加分号,是不是也可以加分号,因为我在一个程序中看到就是在CommandB()和CommandE()后面加分号。还有一个问题,就是我怎么没看到哪本书专门介绍这样的配对使用呢?这种用法是不是很少?
同意flyelf(空谷清音) 
实际上宏就是替换,在程序中将宏替换成宏定义的内容,看看是不是符合语法。一切就清楚了 。
加不加、加在宏中还是程序中,这些都基本没有太多语法原则,因为宏本身是一个相对生硬的预处理机制,不是语言的根本思想,编译器最终也“看”不到,因而只要替换之后满足语言规则就可以了。
这个宏函数如果直接放入程序中,我还真不知道怎么放,将CommandB后面的内容来代替宏,那么CommandE怎么办?
所以才像flyelf说的一样,要配对使用,你看看这个替换结果就明白了:
比如有:
CommandB()
Sleep(1);
CommandE()
预编译之后为:
{
   struct resbuf rB_cmd,rB_usr;
   acedGetVar("CMDECHO",&rB_cmd);
   rB_usr.restype=RTSHORT;
   rB_usr.resval.rint=(int)(0);
   Sleep(1);//中间的代码
   acedSetVar("CMDCEHO",&rB_usr);
   acedSetVar("CMDECHO",&rB_cmd);
};
至于加不加分号那不很显然吗:
CommandB();;;;;;;;;;
Sleep(1);
CommandE();;;;;;;;;;

预编译后为

{   struct resbuf rB_cmd,rB_usr;
   acedGetVar("CMDECHO",&rB_cmd);
   rB_usr.restype=RTSHORT;
   rB_usr.resval.rint=(int)(0);;;;;;;;;//我的妈,数不清了,会意就行了吧。
   Sleep(1);//中间的代码
   acedSetVar("CMDCEHO",&rB_usr);
   acedSetVar("CMDECHO",&rB_cmd);};;;;;;;;;;;//这儿也是

纠正你一个概念,宏就是宏,函数就是函数,不存在宏函数这一个概念,宏就是一个替换,只要他所替换的内容合法,怎么写都无所谓
还是不太明白。能不能举一个完整的例子,就用问题中的宏。
说明一下问题中的宏在代码中怎么使用。
怎么没人来?对于这个宏是怎么使用的?没人来讲讲吗?
这个宏具体是什么用途,恐怕就要问写该宏的作者了
CommandB() 
CommandE()
就是:

{
struct resbuf rB_cmd,rB_usr;
acedGetVar("CMDECHO",&rB_cmd);
rB_usr.restype=RTSHORT;
rB_usr.resval.rint=(int)(0);
acedSetVar("CMDCEHO",&rB_usr);
/*---------------------------------------------*/
acedSetVar("CMDECHO",&rB_cmd);
};/*这里分号没什么没什么具体意义*/

‘\’表示换行,也就是连接了下面一行

这种替换在调试时很有用的

//============================================//
当然你也可以拿来解解闷:

#define Love <iostream.h>

#define I \
   cout<<" I"; \
   cout<<' ';
#define love \
   cout<<"love"; \
   cout<<' ';
#define you \
   cout<<"you"; \
   cout<<endl;
#define My void
#define Baby main() { \
   cout<<"My Baby"<<endl;
#define CSDN \
   cout<<"       CSDN"<<endl; \
   }

#include Love

My Baby
   I love you
      CSDN


一个符合语句后面是要分号的:
{
  ...
};
是这样吧.
这个宏主要是在AutoCAD中使用的,是关闭回显,然后再打开回显。我还有一个问题就是如果只是替换的话,那么
{
struct resbuf rB_cmd,rB_usr;
acedGetVar("CMDECHO",&rB_cmd);
rB_usr.restype=RTSHORT;
rB_usr.resval.rint=(int)(0);
acedSetVar("CMDCEHO",&rB_usr);
/*--------------------------------------------*/ //这里是不是用来添加其他语句的?
acedSetVar("CMDECHO",&rB_cmd);
};//这个分号没有意义,可会不会影响程序的正常执行,如果不影响,那怎么会不影响呢?我看到的许多程序都没有在大括号后加分号的,这是怎么回事呢?
可不可以没有这个分号呢?
可以不要这个分号
是否加分号要看你的意图了! 因为你知道语法的正确与否! :)
mark
不懂
不用加分号,加了分号等于在程序中多了一条空语句。
/-------------------------------------------*/ //这里是不是用来添加其他语句的?
1.对,很明显就是
acedSetVar("CMDECHO",&rB_cmd);
};//这个分号没有意义,可会不会影响程序的正常执行,如果不影响,那怎么会不影响呢?
2.不会,你随便添。
我看到的许多程序都没有在大括号后加分号的,这是怎么回事呢?
3.大括号其实只是一个范围,没其它作用。
比如你有个
if(a>b)
{
   a  = b;
}
你可以这样改:
//if(a>b)
{
   a = b;
}
一样可以运行
楼主:
你好像抄错题目了
acedSetVar("CMDCEHO",&rB_usr);//这行后面是不是还有一个 "}" ?
笔误! 

acedSetVar("CMDCEHO",&rB_usr);//这行后面是不是还有一个 "\" ?
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘