c预处理指令的使用

无参宏定义的语法

#define 标识符(宏名) [字符串(宏体)]

  • 功能:定义可在程序中使用宏,宏的内容由字符串(宏体)替代
  • 宏体可缺省,表示宏名定义过或取消宏体
  • 示例
#define YES 1
#define NO 0
#define OUT printf("Hello world\n")
#define WIDTH 80
#define LENGTH (WIDTH + 40)
var = LENGTH * 2;
宏展开: var = (80 + 40) * 2;

宏的移除语法

#undef 宏名

  • 功能:删除前面定义的宏
  • 示例
#undef PI
#undef OUT
#undef YES
#undef NO

宏定义的规则

  • #表示这是一条预处理指令,以#开头的均为预处理指令
  • #define为宏定义指令,标识符为所定义的宏名
  • 宏名一般习惯用大写字母表示,以便与变量名相区别
  • 宏定义不是c语句,不必在末尾加分号
  • 字符串(宏体)可以是常数,表达式,格式化字符串等。对于数值表达式进行求值的宏定义应该使用括号
  • 在进行宏定义时,可以引用已定义的宏名,可以层层替换
  • 宏替换只做字符串替换,不分配内存空间,不作正确性检查
  • 宏的有效范围为定义之后到本源文件结束,可以用#undef指令终止宏定义的作用域
  • 宏定义的内容为字符串时,要以双引号扩起来,以便与已定义的宏作区分

带参宏定义

示例

#define MAX(a,b) (a > b ? a : b)
int main(void)
{
        printf("%d\n",MAX(1,2));
        return 0;
}

带参宏定义和带参函数很相似,但有本质上的不同

对比带参宏定义带参函数
处理时间编译时程序运行时
参数类型无类型问题定义实参和新参类型
处理过程不分配内存,简单的字符串替换分配内存先求实参值再传给形参
程序长度变长不变
运行速度不占运行时间调用和返回时间
支持递归不支持支持

标签: c,

添加新评论