关于#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)

#define SYSTEM_NOT_INITIALIZED 400001 #define SYSTEM_INIT_FAILED 400002 #define SYSTEM_MAINDIRPATH_SET_ERROR 400003 #define SYSTEM_FACTORY_SET_FAILED 400004 #define SYSTEM_MODALITY_SET_FAILED 430005 #define SYSTEM_STOP_ACQUISITION_FAILED 330016 #define SYSTEM_DO_ACQUISITION_FAILED 430017 #define SYSTEM_DO_RECON_FAILED 430028 #define SYSTEM_STOP_RECON_FAILED 430028 #define SYSTEM_SET_CBCTSUBMODE_FAILED 430028 #define SYSTEM_GET_CBCTSUBMODE_FAILED 430028 #define SYSTEM_SET_PARTIENTYPE_FAILED 430028 #define SYSTEM_GET_PARTIENTYPE_FAILED 430028 #define SYSTEM_SET_PANOORBIT_FAILED 430028 #define SYSTEM_GET_PANOORBIT_FAILED 430028 #define SYSTEM_GET_PROJIMAGEFILEPATH_FAILED 430028 #define SYSTEM_GET_RECONIMAGEFILEPATH_FAILED 430028 #define DETECTOR_QUEAY_FAILED 410001 #define MOTOR_QUEAY_FAILED 420001 #define MOROT_DO_DEMORUN_FAILED 420002 #define MOROT_STOP_DEMORUN_FAILED 420003 #define HV_QUEAY_FAILED 430001 #define HV_SET_KV_FAILED 430002 #define HV_SET_MA_FAILED 430021 #define HV_SET_MS_FAILED 430022 #define HV_SET_ET_FAILED 430023 #define HV_SET_PERIOD_FAILED 430024 #define HV_SET_DUTY_FAILED 430025 #define HV_GET_KV_FAILED 430018 #define HV_GET_MA_FAILED 430021 #define HV_GET_MS_FAILED 430022 #define HV_GET_ET_FAILED 430023 #define HV_GET_PERIOD_FAILED 430024 #define HV_GET_DUTY_FAILED 430025 #define COLLIMATOR_QUEAY_FAILED 440001 #define COLLIMATOR_SET_INDEX_FAILED 440002 #define COLLIMATOR_GET_INDEX_FAILED 440003 #define CAMERA_QUEAY_FAILED 450001 #define CAMERA_SET_SWITCH_FAILED 450002 #define CAMERA_SET_BRIGHTNESS_FAILED 450003 #define CAMERA_SET_CONTRAST_FAILED 430028 #define CAMERA_SET_SATURATION_FAILED 430028 #define CAMERA_SET_SHARPNESS_FAILED 430028 #define CAMERA_GET_SWITCH_FAILED 430028 #define CAMERA_GET_BRIGHTNESS_FAILED 430028 #define CAMERA_GET_CONTRAST_FAILED 430028 #define CAMERA_GET_SATURATION_FAILED 430028 #define CAMERA_GET_SHARPNESS_FAILED 430028 请将宏定义后的数字仿照每段代码(以空白行为分隔)的第一行按顺序改为合适的形式
最新发布
07-22
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值