#的功能是将其后面的宏参数进行字符串化操作(stringfication),简单说就是在对它所引用的宏变量通过替换后在其左右各加上一个双引号。比如下面**中的宏:
#define warn_if(exp)\
do\while(0)
那么实际使用中会出现下面所示的替换过程:
warn_if (divider ==0);
被替换为。do {
if (divider ==0)
fprintf(stderr, "warning" "divider ==0" "n");
while(0);
这样每次divider(除数)为0的时候便会在标准错误流上输出一个提示信息。
当宏参数是另一个宏时。
需要注意的是凡宏定义里有用'#'或'##'的地方宏参数是不会再展开。
2,当有'#'或'##'的时候。
#define a (2)
#define str(s) br##define cons(a,b) int(a##e##b)
printf("int max: %s", str(int_max));int_max#include
这行会被展开为:
printf("int max: %s", int_max");
printf("%s", cons(a, a));compile error
这一行则是:
printf("%s", int(aea));
int_max和a都不会再被展开(宏定义里有用'#'或'##'),然而解决这个问题的方法很简单。加多一层中间转换宏。
加这层宏的用意是把所有宏的参数在这层里全部展开,那么在转换宏里的那一个宏(_str)就能得到正确的宏参数。
#define a (2)
#define _str(s) br##define str(s) _str(s)//中间转换宏。
#define _cons(a,b) int(a##e##b)
#define cons(a,b) _cons(a,b)//中间转换宏。
printf("int max: %s", str(int_max));int_max,int型的最大值,为一个变量,#include
输出为: int max: 0x7fffffff
str(int_max) -str(0x7fffffff)然后再转换成字符串;
printf("%d", cons(a, a));
输出为:200
展开过程如下。
cons(a, a) -cons((2), 2)) int((2)e(2))
define的高级用法
的功能是将其后面的宏参数进行字符串化操作 stringfication 简单说就是在对它所引用的宏变量通过替换后在其左右各加上一个双引号。比如下面 中的宏 define warn if exp do while 0 那么实际使用中会出现下面所示的替换过程 warn if divider 0 被替换为...
AWRWarehouse的高级用法
简介。将所有 awr 数据纳入一个信息库 通过 oracle enterprise manager 12c 触手可及 的想法非常诱人,但提供直接查询 我的许多伙伴就是这样,他们一有 awr 报告或 addm 比较无法回答的业务问题,就会直接查询 的选项也不可忽视。我毫不怀疑他们会对 awr ware...
Excel的几种高级用法
作者 何世华生飞。科学与财富 2010年第08期。摘要 本文从实际应用的角度总结了excel软件中鲜为人知但又具有很大的应用价值的功能,如创建下拉列表 特殊符号工具栏 特殊函数 宏等,以及有关特定的打印功能设置 输入方法设置等。关键词 excel 下拉列表工具栏宏函数。excel作为微软推出的一个应...