宏的语法为 #wow 宏语法名称wow 宏语法值

TA的最新馆藏> 问题详情
如果要引用宏组中的宏名,采用的语法是__________。
悬赏:0&答案豆
提问人:匿名网友
发布时间:
如果要引用宏组中的宏名,采用的语法是__________。
为您推荐的考试题库
您可能感兴趣的试题
1数据结构分为逻辑结构和存储结构,循环队列属于__________结构。2在关系数据厍的基本操作中,从表中抽取满足条件的行的操作称为__________。3根据对数据源操作方式和结果的不同,查询可以分为五类:选择查询、交叉表查询、参数查询、__________和SQL查询。4表的设计视图分为上下两部分,上半部分是__________,下半部分是字段属性区。
我有更好的答案
相关考试课程
请先输入下方的验证码查看最佳答案
图形验证:
验证码提交中……
享三项特权
享三项特权
享三项特权
选择支付方式:
支付宝付款
郑重提醒:支付后,系统自动为您完成注册
请使用微信扫码支付(元)
支付后,系统自动为您完成注册
遇到问题请联系在线客服QQ:
请您不要关闭此页面,支付完成后点击支付完成按钮
遇到问题请联系在线客服QQ:
恭喜您!升级VIP会员成功
常用邮箱:
用于找回密码
确认密码:> 问题详情
以下关于宏的叙述中正确的是()A.宏名必须用大写字母表示B.宏替换时要进行语法检查C.宏替换不占用
悬赏:0&答案豆
提问人:匿名网友
发布时间:
以下关于宏的叙述中正确的是()A.宏名必须用大写字母表示B.宏替换时要进行语法检查C.宏替换不占用运行时间D.宏定义中不允许引用已有的宏名请帮忙给出正确答案和分析,谢谢!
为您推荐的考试题库
您可能感兴趣的试题
1如果文件1包含文件2,文件2中要用到文件3的内容,而文件3中要用到文件4的内容,则可在文件 1中用三个#include命令分别包含文件2、文件3和文件4。在下列关于这几个文件包含顺序的叙述中,正确的一条是(&&)A.文件4应出现在文件3之前,文件3应出现在文件2之前B.文件2应出现在文件3之前,文件3应出现在文件4之前C.文件3应出现在文件2之前,文件2应出现在文件4之前D.出现的先后顺序可以任意2有以下程序段&&main()&&{ char a[7]="abcdef";&&&charb[4]="ABC";&&&strcpy(a,b) ;&&&printf("%c",a[5]);&&}&&程序段运行后的输出结果是(&&)A.aB.\0C.eD.f3下面程序的输出结果是(&&)&&#include<stdio.h>&&f(b,n)&&int b[],n;&&{int i,r;&&r=1;&&for(i=0;i<=n;i++)&&r=r*b[i];&&return r;&&}&&main()&&{int x,a[]={2,3,4,5,6,7,8,9};&&x=f(a,3);&&printf("%d\n",x);&&}A.720B.120C.24D.64下面程序的输出结果是(&&)&&#include"stdio.h"&&fun(x)&&int&x;&&{&&int y=0;&&static int z=5;&&z=x++,y++;&&return(z);&&}&&main()&&int a=4,i,j;&&for&(i=0;i<2;i++)&&j=fun(a++);&&printf("%d",j);&&}A.0B.3C.4D.5
我有更好的答案
相关考试课程
请先输入下方的验证码查看最佳答案
图形验证:
验证码提交中……
享三项特权
享三项特权
享三项特权
选择支付方式:
支付宝付款
郑重提醒:支付后,系统自动为您完成注册
请使用微信扫码支付(元)
支付后,系统自动为您完成注册
遇到问题请联系在线客服QQ:
请您不要关闭此页面,支付完成后点击支付完成按钮
遇到问题请联系在线客服QQ:
恭喜您!升级VIP会员成功
常用邮箱:
用于找回密码
确认密码:C语言宏用法总结_radasm吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:331贴子:
C语言宏用法总结收藏
-------------------------------------------------------------------------------收集 归纳整理网上的东西 剩下的
你懂的出处太多 就不给出处了 自己百度 + Google-------------------------------------------------------------------------------(1).防止一个头文件被重复包含#ifndef COMDEF_H#define COMDEF_H//头文件内容#endif .(2).重新定义一些类型,防止由于各种平台和编译器的不同,而产生的类型字节数差异,方便移植。typedef
/* Boolean value type. */typedef
unsigned long int
/* Unsigned 32 bit value */typedef
unsigned short
/* Unsigned 16 bit value */typedef
unsigned char
/* Unsigned 8
bit value */typedef
signed long int
/* Signed 32 bit value */typedef
signed short
/* Signed 16 bit value */typedef
signed char
/* Signed 8
bit value *///下面的不建议使用typedef
/* Unsigned 8
bit value type. */typedef
/* Unsinged 16 bit value type. */typedef
/* Unsigned 32 bit value type. */typedef
unsigned char
/* Unsigned 8
bit value type. */typedef
unsigned short
/* Unsigned 16 bit value type. */typedef
unsigned long
/* Unsigned 32 bit value type. */typedef
signed char
/* Signed 8
bit value type. */typedef
signed short
/* Signed 16 bit value type. */typedef
/* Signed 32 bit value type. */typedef
signed long
/* Signed 32 bit value */typedef
signed short
/* Signed 16 bit value */typedef
signed char
/* Signed 8
bit value */ .(3).得到指定地址上的一个字节或字#define
MEM_B(x) (*((byte *)(x)))#define
MEM_W(x) (*((word *)(x))) .(4).求最大值和最小值#define
MAX(x,y) (((x)&(y)) ? (x) : (y))#define
MIN(x,y) (((x) & (y)) ? (x) : (y))像这样的宏要注意打上括号
不然遇到优先级问题的时候 结果可能和预期值不一样 .(5).得到一个field在结构体(struct)中的偏移量#define FPOS(type,field) ((dword)&((type *)0)-&field) .(6).得到一个结构体中field所占用的字节数#define FSIZ(type,field) sizeof(((type *)0)-&field) .(7).按照LSB格式把两个字节转化为一个Word#define FLIPW(ray) ((((word)(ray)[0]) * 256) + (ray)[1]) .(8).按照LSB格式把一个Word转化为两个字节#define FLOPW(ray,val) (ray)[0] = ((val)/256); (ray)[1] = ((val) & 0xFF) .(9).得到一个变量的地址(word宽度)#define B_PTR(var)
((byte *) (void *) &(var))#define W_PTR(var)
((word *) (void *) &(var)) .(10).得到一个字的高位和低位字节#define WORD_LO(xxx)
((byte) ((word)(xxx) & 255))#define WORD_HI(xxx)
((byte) ((word)(xxx) && 8)) .(11).返回一个比X大的最接近的8的倍数#define RND8(x) ((((x) + 7)/8) * 8)
游戏特效培训,毕业年薪20w,来CGWANG吧!
.(12). 将一个字母转换为大写#define UPCASE(c) (((c)&='a' && (c) &= 'z') ? ((c) - 0x20) : (c)).(13) 判断字符是不是10进值的数字#define
DECCHK(c) ((c)&='0' && (c)&='9') .(14).判断字符是不是16进值的数字#define HEXCHK(c) (((c) &= '0' && (c)&='9') ((c)&='A' && (c)&= 'F') \((c)&='a' && (c)&='f')) .(15).防止溢出的一个方法#define INC_SAT(val) (val=((val)+1&(val)) ? (val)+1 : (val)) .(16). 返回数组元素的个数#define ARR_SIZE(a)
(sizeof((a))/sizeof((a[0]))) .(17). 返回一个无符号数n尾的值MOD_BY_POWER_OF_TWO(X,n)=X%(2^n)#define MOD_BY_POWER_OF_TWO( val, mod_by ) ((dword)(val) & (dword)((mod_by)-1)) .(18). 对于IO空间映射在存储空间的结构,输入输出处理#define inp(port) (*((volatile byte *)(port)))#define inpw(port) (*((volatile word *)(port)))#define inpdw(port) (*((volatile dword *)(port)))#define outp(port,val) (*((volatile byte *)(port))=((byte)(val)))#define outpw(port, val) (*((volatile word *)(port))=((word)(val)))#define outpdw(port, val) (*((volatile dword *)(port))=((dword)(val))) .(19).使用一些宏跟踪调试ANSI标准说明了五个预定义的宏名。它们是:__LINE____FILE____DATE____TIME____STDC__C++中还定义了 __cplusplus 如果编译器不是标准的,则可能仅支持以上宏名中的几个,或根本不支持。记住编译程序也许还提供其它预定义的宏名。 __LINE__ 及 __FILE__ 宏指示,#line指令可以改变它的值,简单的讲,编译时,它们包含程序的当前行数和文件名。 __DATE__ 宏指令含有形式为月/日/年的串,表示源文件被翻译到代码时的日期。__TIME__ 宏指令包含程序编译的时间。时间用字符串表示,其形式为: 分:秒__STDC__ 宏指令的意义是编译时定义的。一般来讲,如果__STDC__已经定义,编译器将仅接受不包含任何非标准扩展的标准C/C++代码。如果实现是标准的,则宏__STDC__含有十进制常量1。如果它含有任何其它数,则实现是非标准的。__cplusplus 与标准c++一致的编译器把它定义为一个包含至少6为的数值。与标准c++不一致的编译器将使用具有5位或更少的数值。 可以定义宏,例如:当定义了_DEBUG,输出数据信息和所在文件所在行#ifdef _DEBUG#define DEBUGMSG(msg,date) printf(msg);printf(“%d%d%d”,date,_LINE_,_FILE_)#else#define DEBUGMSG(msg,date) #endif.
.(20).宏定义防止错误使用小括号包含。例如:有问题的定义:#define DUMP_WRITE(addr,nr) {memcpy(bufp,addr,nr); bufp +=}应该使用的定义: #difne DO(a,b) do{a+b;a++;}while(0)例如:if(addr)
DUMP_WRITE(addr,nr);else
do_somethong_else();宏展开以后变成这样:if(addr)
{memcpy(bufp,addr,nr); bufp +=};else
do_something_else(); gcc 在碰到else前面的“;”时就认为if语句已经结束,因而后面的else不在if语句中。而采用do{} while(0)的定义,在任何情况下都没有问题。而改为 #difne DO(a,b) do{a+b;a++;}while(0) 的定义则在任何情况下都不会出错。
关于#和##在C语言的宏中,(1)#的功能是将其后面的宏参数进行字符串化操作(Stringfication),简单说就是在对它所引用的宏变量通过替换后在其左右各加上一个双引号。比如下面代码中的宏: #define WARN_IF(EXP)
do{ if (EXP)
fprintf(stderr, "Warning: " #EXP ""); \
}while(0); 那么实际使用中会出现下面所示的替换过程:WARN_IF (divider == 0);被替换为do {
if (divider == 0)fprintf(stderr, "Warning" "divider == 0" "");} while(0); 这样每次divider(除数)为0的时候便会在标准错误流上输出一个提示信息。 (2)而##被称为连接符(concatenator),用来将两个Token连接为一个Token。注意这里连接的对象是Token就行,而不一定是宏的变量。比如你要做一个菜单项命令名和函数指针组成的结构体的数组,并且希望在函数名和菜单项命令名之间有直观的、名字上的关系。那么下面的代码就非常实用: COMMAND宏在这里充当一个代码生成器的作用,这样可以在一定程度上减少代码密度,间接地也可以减少不留心所造成的错误。我们还可以n个##符号连接 n+1个Token,这个特性也是#符号所不具备的。比如:
关于...的使用...在C宏中称为Variadic Macro,也就是变参宏。比如:第一个宏中由于没有对变参起名,我们用默认的宏__VA_ARGS__来替代它。第二个宏中,我们显式地命名变参为args,那么我们在宏定义中就可以用 args来代指变参了。同C语言的stdcall一样,变参必须作为参数表的最有一项出现。当上面的宏中我们只能提供第一个参数templt时,C标准要 求我们必须写成:的形式。这时的替换过程为:这是一个语法错误,不能正常编译。这个问题一般有两个解决方法。首先,GNU CPP提供的解决方法允许上面的宏调用写成: 而它将会被通过替换变成:很明显,这里仍然会产生编译错误(非本例的某些情况下不会产生编译错误)。除了这种方式外,c99和GNU CPP都支持下面的宏定义方式: 这时,##这个连接符号充当的作用就是当__VAR_ARGS__为空的时候,消除前面的那个逗号。那么此时的翻译过程如下:这样如果templt合法,将不会产生编译错误。
关于C语言变参宏
可以参考我以前做的一份笔记主要利用C调用约定 由调用者来平衡堆栈
错误的嵌套-Misnesting宏的定义不一定要有完整的、配对的括号,但是为了避免出错并且提高可读性,最好避免这样使用。 由操作符优先级引起的问题-Operator Precedence Problem由于宏只是简单的替换,宏的参数如果是复合结构,那么通过替换之后可能由于各个参数之间的操作符优先级高于单个参数内部各部分之间相互作用的操作符优先级,如果我们不用括号保护各个宏参数,可能会产生预想不到的情形。比如:那么被转化为这显然不是调用者的初衷。为了避免这种情况发生,应当多写几个括号:所以在优先级上面
要引起重视
不要假定任何优先级
消除多余的分号-Semicolon Swallowing通常情况下,为了使函数模样的宏在表面上看起来像一个通常的C语言调用一样,通常情况下我们在宏的后面加上一个分号,比如下面的带参宏: 但是如果是下面的情况:这样会由于多出的那个分号产生编译错误。为了避免这种情况出现同时保持MY_MACRO(x);的这种写法,我们需要把宏定义为这种形式: 这样只要保证总是使用分号,就不会有任何问题。By The Way:有些看起来像函数那样的宏
有多跳语句这个时候
写在没加{}的for,if...语句后面
只执行了一条语句 这个时候找错误将是及其困难的 所以 在写if for ...等语句时候 一定要加上 { }
Duplication of Side Effects这里的Side Effect是指宏在展开的时候对其参数可能进行多次Evaluation(也就是取值),但是如果这个宏参数是一个函数,那么就有可能被调用多次从而达到不一致的结果,甚至会发生更严重的错误。比如:这时foo()函数就被调用了两次。为了解决这个潜在的问题,我们应当这样写min(X,Y)这个宏:({...})的作用是将内部的几条语句中最后一条的值返回,它也允许在内部声明变量(因为它通过大括号组成了一个局部Scope)未完待续 .......
本贴请暂时别灌水
....... ....当然 如果你有更好的 请在后面帮我总结
但是请别和前面重复...
关于#pragram 宏
在for语句里面的i变量是函数作用域在VS2005以上版本中 确变成了块作用域
所以为了达到可移植性请使用注释部分的宏
这样就强制VC6.0使用块作用域
CGWANG影视后期包装培训 专业培训机构
10楼出现错误贴定义成#define
if(1)for是错误的如果 #define
if(1)for 那么 for(;;)
} 也合乎语法了!所以 应该定一成#define for if(0);else for
继续楼上的帖子 为什么要定义成#define for if(0);else for不定义成 #define for if(1)for因为if(0){
//这里是不可达分支 编译器优化会去掉这个代码}else for(i & 5;i++){
//最后else 也会被优化掉
printf("12345");}最后的效果 就会和直接使用for效果一样if(1){ for(...){}
}可能有的编译器就没有优化掉
这样就会产生冗余代码当然VC6.0
好像都优化了
但是你不能保证所有的编译器都优化了吧?
请看第一楼 第一个宏在XP下有个小工具,guidgen
据说可以生成全球唯一标识符运行如下界面有4个种选项 .....然后
按照这个..来定义防止重复包含头文件的宏
...好像微软有的头文件就是这么做的
当然 微软提供了 一个#pragram once来防止重复包含头文件
但不幸的是这个不是ASCI标准
一些宏测试 以及其写法 ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
登录百度帐号推荐应用
为兴趣而生,贴吧更懂你。或}

我要回帖

更多关于 剑网3宏语法 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信