C语言 define 关键字

1)取出两个数值中的最小值
#define MIN(A,B) (((A)>(B))? (B):(A))

2)用宏定义实现一个32 int类型变量 取绝对值
#define  ABS(n) (((unsigned int)n>>31 == 0x1) ? (-n):(n))
#define ABS2(n)  ((n ^ (n >> 31)) - (n >> 31))


3)在上面定义的基础上,进而可以实现不用大于号的方式实现比较两个变量的大小
#define MIN(A,B) (ABS((A)-(B)) == ((A)-(B)))? (B):(A)


4)重复包含头文件的问题
#ifndefined  __ABC_FILE_H__
#define __ABC_FILE_H__
//头文件内容
#endif

5)用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题)
#define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL

6)关于define # 的用法 (define 与字符串处理)

"#"用来把参数转换成字符串,是给参数加上双引号。
"##"则用来连接前后两个参数,把它们变成一个参数,
"#@"是给参数加上单引号。下面的例子会使您很容易理解。
#define CAT(x,y) x##y       /* CAT(1,"abc") => "1abc" */
#define TOCHAR(a) #@a       /* TOCHAR(1) => '1' */
#define TOSTRING(x) #x      /* TOSTRING(1) => "1" */

例子:把数字和字符串通过宏定义链接的方法
#define TOSTR(x) #x
#define TEST_STR "nihao_123"
#define CAT1(int1, int2) TOSTR(int1) TOSTR(int2) "_" TEST_STR
#define NUM_1 11
#define NUM_2 33

#define ALL_TEST_STR CAT1(NUM_1, NUM_2)      /* "1122_nihao_123" */


二)关于宏定义 与 do{}while(0)

一下内容参考来源:http://www.spongeliu.com/415.html

eg.
#define SAMPLE(xxx) \
    do                            \
    {                               \
        if(1 != xxx)           \
            ...;                    \
    }while(0)


1、辅助定义复杂的宏,避免引用的时候出错 //是否可以用大括号代替 {}?
2、优化替代goto语句,实现对程序流程更好的控制
3、避免空宏引起的warning //是否可以用大括号代替 {}?
4、定义一个单独的函数块来实现复杂的操作 //是否可以用大括号代替 {}?

int foo()
{
    somestruct* ptr = malloc(...);
 
    dosomething...;
    if(error)
    {
        goto END;
    }
 
    dosomething...;
    if(error)
    {
        goto END;
    }
    dosomething...;
 
END:
    free(ptr);
    return 0;
 
}
int foo()
{
 
    somestruct* ptr = malloc(...);
 
    do{
        dosomething...;
        if(error)
        {
            break;
        }
 
        dosomething...;
        if(error)
        {
            break;
        }
        dosomething...;
    }while(0);
 
    free(ptr);
    return 0;
 
}
 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值