c语言学习(宏定义)

目录

常见的宏定义

一,不带参数的宏定义(所谓的标识符常量)

功能:

预处理:

说明:

格式要求:

二,带参数的宏定义

功能:

说明:


常见的宏定义

常见的宏定义有两种,不带参数的宏定义和带参数的宏定义

一,不带参数的宏定义(所谓的标识符常量)

#define 宏名 字符串

功能:

在编程时,可以用宏名代表相应的字符串,在预处理时,程序中的宏名将会被自动替换成相应的字符串。(宏定义是比较常用的预处理指令,即使用“标识符”来表示“替换列表”中的内容。标识符称为宏名,在预处理过程中预处理器会把源程序中所有宏名,替换成宏定义中替换列表中的内容)

预处理:

在c语言中,程序如果想要从编译到运行需要经过几个步骤
test.c(源文件)test.exe(可执行文件)
经过:预编译 编译 汇编 链接 运行,而宏定义就是在预处理阶段处理

说明:

1,宏名遵循标识符命名规则,通常为大写

2,字符串不带双引号

3,末尾不带分号,如果带分号,将作为字符串的组成部分

4,必要时,可以用#undef命令终止宏的作用域(格式 undef 宏名)

例:

#define PI 3.14
#define JAKE 300

格式要求:

1, # 可以不在行首,但只允许它前面有空格符。例如:

#define PI 3.1416 //正确,该行#前允许有空格
int a;#define N 5 //错误,该行#前不允许有空格外的其他字符

2, 标识符和替换列表之间不能加赋值号 =,替换列表后不能加分号

#define N =5 //虽语法正确,但预处理器会把N替换成=5
int a[N]; //错误,因为宏替换之后为 int a[=5]

宏定义不是语句,是预处理指令,故结尾不加分号。如果不小心添加了分号,虽然有时该宏定义没问题,但在宏替换时,可能导致 C 语法错误,或得不到预期结果。例如:

#define N 5; //虽语法正确,但会把N替换成5;
int a[N]; //语法错误,宏替换后,为int a[5;];错误

3, 由于宏定义仅是做简单的文本替换,故替换列表中如有表达式,必须把该表达式用括号括起来,否则可能会出现逻辑上的“错误”。例如:

#define N 3+2
int r=N*N;

宏替换后为:

int r=3+2*3+2; //r=11

如果采用如下形式的宏定义:

#define N (3+2)
int r=N*N;

则宏替换后,为:

int r=(3+2)*(3+2); //r=25

4,当替换列表一行写不下时,可以使用反斜线\作为续行符延续到下一行。例如:

#define USA "The United \
States of \
America"

该宏定义中替换列表为字符串常量,如果该串较长,或为了使替换列表的结构更清晰,可使用续行符 \ 把该串分若干行来写,除最后一行外,每行行尾都必须加续行符 \。

如果调用 printf 函数,以串的形式输出该符号常量,即:

printf("%s\n",USA);

则输出结果为:The United States of America

注意:续行符后直接按回车键换行,不能含有包括空格在内的任何字符,否则是错误的宏定义形式

二,带参数的宏定义

参数的概念:如果我们引入一个或一些另外的变量来描述自变量与因变量的变化,引入的变量本来并不是当前问题必须研究的变量,我们把这样的变量叫做参变量或参数。

#define 宏名(参数表)表达式

功能:

在编程时,可以用带参数的宏代表相应的表达式,在预处理时,程序中的宏将会被自动替换成相应的表达式,表达式中的参数会自动替换成宏中给定的参数

说明:

1,宏名遵循标识符命名规则,通常为大写

2,参数之间用逗号分隔

3,末尾不带分号,如果带分号,将作为表达式部分

例:

#define PI 3.14

#define S(r) PI*r*r

在此前提下,程序中的S(2.5)将会被替换为3.14*2.5*2.5

例如,求两个参数中最大值的带参宏定义为:

#define MAX(a,b) ((a)>(b)?(a) : (b))

当有如下语句时:

int c=MAX(5,3)

预处理器会将带参数的宏替换成如下形式:

int c=((5)>(3)?(5) : (3));

故计算结果c=5

说明:
1, 标识符与参数表的左括号之间不能有空格,否则预处理器会把该宏理解为普通的无参宏定义,故以下是错误的带参宏定义形式。

#define MAX (a,b) ( (a) > (b) ? (a) : (b) ) //错误的带参宏定义格式

2),宏替换列表中每个参数及整个替换列表,都必须用一对小括号 () 括起来,否则可能会出现歧义

  • 6
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一起慢慢变强

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值