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" */

二)关于宏定义 与 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;
 
}
 

你可能感兴趣的:(C)