关于#define

1. 被定义为“宏”的标识符称为“宏名”。在编译预处理时,对程序中所有出现的“宏名”,都用宏定义中的字符串去代换,这称为“宏代换”或“宏展开”。作用范围仅限于当前文件。

2. 在#define中,标准只定义了#和##两种操作。#用来把参数转换成字符串,##则用来连接前后两个参数,把它们变成一个字符串。

#define print(n) printf("num"#n"=%d\n",num##n)

int  num7=7;
print(7);
输出为:num7 = 7


① 无参宏定义的一般形式为:#define 标识符 字符串

凡是以“#”开头的均为预处理命令。“define”为宏定义命令。“标识符”为所定义的宏名。“字符串”可以是常数、表达式、格式串等。

例如: #define M (a+b) 它的作用是指定标识符M来代替表达式(a+b)。

#ifdef MAN
#define NAME "tony"
#else
#define NAME "jack"
#endif

#define MAN_NAME "he is "NAME
#define NULL 0L

② 带参宏定义的一般形式为:  #define 宏名(形参表) 字符串

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

intx,y,max;

max=MAX(x,y);


3. 重复包含(重复定义)由于头文件包含可以嵌套,那么C文件就有可能包含多次同一个头文件,就可能出现重复定义的问题的。 通过条件编译开关来避免重复包含(重复定义)。

#ifndef HELLO 或 #ifdef HELLO
#defineHELLO #define HELLO "hello"
//文件内容 #else
#defineHELLO "hi"
#endif#endif

4. 有意思的宏定义

① 宏变量 反斜线换行

#define DEBUG debugFlag
extern int debugFlag; //可以在后面

#ifndef Printf
#define Printf(format...)  \ //采用反斜线换行
do{\
if(DEBUG){\
printf("[%s]:%d ", __FILE__, __LINE__);\
printf(format);} \
} while(0)
#endif


② 判断表达式或者函数执行结果

#define CHECK_RET(express)\
do{\
int ret= express;\
if (0 != ret)\
{\
printf("fun:%s,line:%d,failed! %x\n", __FUNCTION__, __LINE__, ret);\
}\
}while(0)


③ 对齐,align的值必须是2的N次方。
//向上对齐,例如:ALIGN_CEILING(9,8) = 16
#define ALIGN_CEILING(x,align)     ( ((x) + ((align) - 1) ) & ( ~((align) - 1) ) )
//向下对齐,例如:JV_ALIGN_FLOOR(9,8) = 8
#define JALIGN_FLOOR(x,align)       (  (x) & (~((align) - 1) ) )

④ 将value变为min,max范围内的值
#define VALID_VALUE(value, min, max) (value<min)?min:((value>max)?max:value)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值