• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • YouClaw
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
FIELDOFFIER
博客园    首页    新随笔    联系   管理    订阅  订阅

C中的预处理宏

C中的预处理宏

宏定义就属于预处理命令的一种。那么,什么是宏呢?
宏:c语言标准允许在程序中用一个标识符来表示一个字符串。标识符就是宏名。
宏替换:宏替换就是宏定义。在编译预处理中,将程序中所有的宏名用相应的字符串来替换,这个过程称为宏替换。

宏分为两种:
1、无参数宏   #define 标识符 字符串
2、带参数宏   #define 标识符(形参表) 字符串

因为无参数宏比较简单,所以重点说一下带参数宏。

 

 有参宏定义中#的用法

  #define STR(str) #str

  #用于把宏定义中的参数两端加上字符串的""

  比如,这里STR(my#name)会被替换成"my#name"

  一般由任意字符都可以做形参,但以下情况会出错:

  STR())这样,编译器不会把“)”当成STR()的参数。

  STR(,)同上,编译器不会把“,”当成STR的参数。

  STR(A,B)如果实参过多,则编译器会把多余的参数舍去。

  STR((A,B))会被解读为实参为:(A,B),而不是被解读为两个实参,第一个是(A第二个是B)。  

  一个预处理宏的例子:

  # define PRINT(STR,VAR) cout<<STR “ = “<<VAR<<endl;

  跟在宏名后面的括号中的参数会被闭括号后面的所有代码替代。只要在调用宏的地方,预处理程序就删除名字PRINT并替换代码,所以使用宏名时编译器不会报告任何错误信息,它并不对参数做任何类型检查。

 

 有参宏定义中##的用法

  #define WIDE(str) L##str

  则会将形参str的前面加上L

  比如:WIDE("abc")就会被替换成L"abc"

  如果有#define FUN(a,b) vo##a##b()

  那么FUN(id ma,in)会被替换成void main()

  另一个例子:

  # define P(EX) cout<<#EX<< “:”<<EX<<endl;

  其中的“#”被称为:字符串化的预处理特征,其作用是获得任何一个表达式并把它转换为一个字符数组。

  多行宏定义:

  #define doit(m,n) for(int i=0;i<(n);++i)\

  {\

  m+=i;\

  }

posted @ 2016-04-04 17:15  FIELDOFFIER  阅读(1005)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3