C语言宏定义.docVIP

  1. 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
C语言宏定义C语言宏定义

C语言宏定义 定义简单的常数:定义常量,便于修改(切不可在后面加上分号!) #define N 1000 等效于 const int N = 1000; 但略有不同,define只是简单替换,而不是作为一个量来使用. 定义简单的函数:注意多使用括号 #define MAX(x, y) ((x) (y)) ? (x) : (y) 定义单行宏:主要有以下三种用法. 1) 前加##或后加##,将标记作为一个合法的标识符的一部分.注意,不是字符串.多用于多行的宏定义中.例如: #define A(x) T_##x 则 int A(1) = 10; //等效于int T_1 = 10; #define A(x) Tx##__ 则 int A(1) = 10; //等效于int T1__ = 10; 2) 前加#@,将标记转换为相应的字符,注意:仅对单一标记转换有效(理解有误?) #define B(x) #@x 则B(a)即’a’,B(1)即’1’.但B(abc)却不甚有效. 3) 前加#,将标记转换为字符串. #define C(x) #x 则C(1+1) 即 ”1+1”. 定义多行宏:注意斜杠的使用,最后一行不能用斜杠. #define DECLARE_RTTI(thisClass, superClass)\ virtual const char* GetClassName() const\ {return #thisClass;}\ static int isTypeOf(const char* type)\ {\ if(!strcmp(#thisClass, type)\ return 1;\ return superClass::isTypeOf(type);\ return 0;\ }\ virtual int isA(const char* type)\ {\ return thisClass::isTypeOf(type);\ }\ static thisClass* SafeDownCast(DitkObject* o)\ {\ if(oo-isA(#thisClass))\ return static_castthisClass*(o);\ return NULL;\ } 用于条件编译:(常用形式) #ifndef _AAA_H #define _AAA_H //c/c++代码 #endif 一些注意事项: 1) 不能重复定义.除非定义完全相同.#define A(x) … 和#define A 是重复定义. 2) 可以只定义符号,不定义值.如#define AAA 关于#和## 在C语言的宏中,#的功能是将其后面的宏参数进行字符串化操作(Stringfication),简单说就是在对它所引用的宏变量通过替换后在其左右各加上一个双引号。比如下面代码中的宏: #define WARN_IF(EXP) do{ if (EXP) fprintf(stderr, Warning: #EXP \n); } while(0) 那么实际使用中会出现下面所示的替换过程: WARN_IF (divider == 0); 被替换为 do { if (divider == 0) fprintf(stderr, Warning divider == 0 \n); } while(0); 这样每次divider(除数)为0的时候便会在标准错误流上输出一个提示信息。 而##被称为连接符(concatenator),用来将两个Token连接为一个Token。注意这里连接的对象是Token就行,而不一定是宏的变量。比如你要做一个菜单项命令名和函数指针组成的结构体的数组,并且希望在函数名和菜单项命令名之间有直观的、名字上的关系。那么下面的代码就非常实用: struct command { char * name; void (*function) (void); }; #define COMMAND(NAME) { NAME, NAME ## _command } // 然后你就用一些预先定义好的命令来方便的初始化一个command结构的数组了: struct command commands[] = { COMMAND(quit), COMMAND(help), ... } COMMAND宏在这里充当一个代码生成器的作用,这样可以在一定程度上减少代码密度,间接地也可以减少不留心所造成的错误。我们还可以n个##符号连接 n+1个Token,这个特性也是#符号所不具备的。比如

文档评论(0)

skewguj + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档