C/C++中的宏

宏定义了一个代表特定内容的标识符。预处理过程会把源代码中出现的宏标识符替换成宏定义时的值。宏

最常见的用法是定义代表某个值的全局符号。宏的第二种用法是定义带参数的宏,这样的宏可以象函数一样

被调用,但它是在调用语句处展开宏,并用调用时的实际参数来代替定义中的形式参数。


1.#define指令

#define预处理指令是用来定义宏的。该指令最简单的格式是:首先神明一个标识符,然后给出这个标

识符代表的代码。在后面的源代码中,就用这些代码来替代该标识符。这种宏把程序中要用到的一些全局值

提取出来,赋给一些记忆标识符。

#define MAX_NUM 10

int array[MAX_NUM];

for(i = 0; i < MAX_NUM; i++) /*……*/

在这个例子中,对于阅读该程序的人来说,符号MAX_NUM就有特定的含义,它代表的值给出了数

组所能容纳的最大元素数目。程序中可以多次使用这个值。作为一种约定,习惯上总是全部用大写字母来定

义宏,这样易于把程序红的宏标识符和一般变量标识符区别开来。如果想要改变数组的大小,只需要更改宏

定义并重新编译程序即可。

宏表示的值可以是一个常量表达式,其中允许包括前面已经定义的宏标识符。例如:

#define ONE 1

#define TWO 2

#define THREE (ONE+TWO)

注意上面的宏定义使用了括号。尽管它们并不是必须的。但出于谨慎考虑,还是应该加上括号的。例

如:

six = THREE * TWO;

预处理过程把上面的一行代码转换成:

six = (ONE + TWO) * TWO;

如果没有那个括号,就转换成six = ONE + TWO * TWO;了。

宏还可以代表一个字符串常量,例如:

#define VERSION "Version 1.0 Copyright(c) 2003"


2.带参数的#define指令

带参数的宏和函数调用看起来有些相似。看一个例子:

#define Cube(x) (x) * (x) * (x)

可以时任何数字表达式甚至函数调用来代替参数x。这里再次提醒大家注意括号的使用。宏展开后完全

包含在一对括号中,而且参数也包含在括号中,这样就保证了宏和参数的完整性。看一个用法:

int num = 8 + 2;

volume = Cube(num);

展开后为(8 + 2) * (8 + 2) * (8 + 2);

如果没有那些括号就变为8 + 2 * 8 + 2 * 8 + 2了。

下面的用法是不安全的:

volume=Cube(num++);

如果Cube是一个函数,上面的写法是可以理解的。但是,因为Cube是一个宏,所以会产生副作用。

这里的擦书不是简单的表达式,它们将产生意想不到的结果。它们展开后是这样的:

volume = (num++) * (num++) * (num++);

很显然,结果是10*11*12,而不是10*10*10;

那么怎样安全的使用Cube宏呢?必须把可能产生副作用的操作移到宏调用的外面进行:

int num = 8 + 2;

volume = Cube(num);

num++;


3.#运算符
出现在宏定义中的#运算符把跟在其后的参数转换成一个字符串。有时把这种用法的#称为字符串化运算符。例如:
#define PASTE(n) "adhfkj"#n
void main()
{
printf("%s/n",PASTE(15));
}
宏定义中的#运算符告诉预处理程序,把源代码中任何传递给该宏的参数转换成一个字符串。所以输出
应该是adhfkj15。

4.##运算符
##运算符用于把参数连接到一起。预处理程序把出现在##两侧的参数合并成一个符号。看下面的例子:
#define NUM(a,b,c) a##b##c
#define STR(a,b,c) a##b##c
void main()
{
printf("%d/n",NUM(1,2,3));
printf("%s/n",STR("aa","bb","cc"));
}
最后程序的输出为:
123
aabbcc
千万别担心,除非需要或者宏的用法恰好和手头的工作相关,否则很少有程序员会知道##运算符。绝大多数程序员从来没用过它。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值