C++分析研究  
C++
日历
<2014年11月>
2627282930311
2345678
9101112131415
16171819202122
23242526272829
30123456
统计
  • 随笔 - 92
  • 文章 - 4
  • 评论 - 4
  • 引用 - 0

导航

常用链接

留言簿

随笔档案

文章档案

搜索

  •  

最新评论

阅读排行榜

评论排行榜

 
  1.简单的宏定义
 
   #define 标识符 替换列表(替换列表可以是数,字符串字面量,标点符号,运算符,标识符,关键字,字符常量。注意:替换列表是可以为空的)
 
   典型错误:
 
   #define N = 100
 
   int a[N]; /*这样会成为int a[= 100],这里会处理成为一种标识记号一样*/
 
   #define N 100;
 
   int a[N]; /*带分号的定义会成为int a[100;],这是一种很常见的错误*/
 
   #define pin (int*);
 
   pin a,b;
 
   int* a,b; /*本意是a和b都是int型指针,但是实际上变成int* a,b;a是int型指针,而b是int型变量。这是应该使用typedef来代替define,这样a和b就都是int型指针了。*/
 
   典型的使用方法:
 
   使用宏定义我们可以自己根据自己的习惯来定义甚至改变C语言的语法习惯,例如雅思改分
 
   #define BEGIN {
 
   #define END }
 
   int main()BEGIN
 
   printf ("DEFINE----\n");
 
   END
 
   定义一个循环
 
   #define LOOP for(;;)
 
   重新定义数据类型
 
   #define IT int
 
   2.带参数的宏
 
   #define 标识符(x1,x2,x3...xn) 替换列表 (注意:x1,x2,x3..是宏的参数,标识符和其左括弧之间不能有空格)
 
   使用方法:
 
   #define MAX(x,y) ((x)>(y)?(x):(y))
 
   i=MAX(j+k,m-n);
 
   替换为:
 
   i=MAX((j+k)>(m-n)?(j+k):(m-n));
 
   #define SI_EX(n) ((n)%2==0)
 
   if(SI_EX(i)) i++;
 
   替换为:
 
   if(SI_EX((i)%2==0))
 
   通过以上例子我们可以看出,标识符带参数(X1,X2,X3.....)在替换时会被替换列表(Y1,Y2,Y3....)对应的替换,但是和顺序无关。
 
   3.宏的特殊单行定义
 
   #define A(x) T_##x
 
   #define B(x) #@x
 
   #define C(x) #x
 
   x=1
 
   替换为:
 
   A(1)------> T_1 (T_##x,##符号是记号粘黏符号,将前后的字符粘黏起来。)
 
   B(1)------> '1' ( #@x , #@ 符号会将宏的参数进行字符串字面量化,并且加‘’号)
 
   C(1)------> "1" ( #x ,#符号会将宏的参数进行字符串字面量化,并且加""号)
 
   4.define的多行定义
 
   define可以替代多行的代码,在每一个换行的时候加上一个"\"
 
   #define MAX(X,Y) do { \
 
   语句1; \
 
   语句2; \
 
   /* 注释的写法 */ \
 
   } while(0) /* (no trailing ; ) */ \
 
   5.在大规模的开发过程中,特别是跨平台和系统的软件里,define最重要的功能是条件编译。
 
   #ifdef WINDOWS
 
   ......
 
   ......
 
   #endif
 
   #ifdef LINUX
 
   ......
 
   ......
 
   #endif
 
   可以在编译的时候通过#define设置编译环境
 
   6.取消宏
 
   #undef 标识符
 
   7.条件编译
 
   #ifdef XXX…(#else) … #endif
 
   8.预定义宏
 
   在C语言中收录了一些有用的宏,这些宏是提供当前编译信息的。
 
   __LINE__ 被编译文件的行数
 
   (整型)
 
   __FILE__ 被编译文件的名字 (字符型)
 
   __DATE__ 编译日期 (字符型)
 
   __TIME__ 编译时间 (字符型)
 
   __STDC__ 如果编译器接受标准C,那么值为1. (整型)
 
   通常我们在编译的时候我们可以用这些预定义的宏来进行排错,例如雅思答案
 
   一般情况下,当出现除零的情况时编译器是没有提示的,我们可以自定义一个解决办法。
 
   #define CHECKZERO(divisor)\
 
   if(divisor==0)\
 
   printf("***ATTEMPT TO DIVIDE BY ZERO IN LINE %d of file %s ***\n",__LINE__,__FILE__);\
 
   引用方法
 
   CHECKZERO(j);
 
   k=i/j;
 
posted on 2013-06-07 17:20 HAOSOLA 阅读(359) 评论(0)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理


 
Copyright © HAOSOLA Powered by: 博客园 模板提供:沪江博客
PK10开奖 PK10开奖