使用宏定义方式进行非法指针判定-嵌入式C

来源:互联网 发布:库卡krc 5.6编程软件 编辑:程序博客网 时间:2024/05/16 05:29
#include <stdio.h>#include <stdlib.h>// test parameters for level 2nd#define AUDIO_DEVICE_ID     (0x9527)#define AUDIO_NAME_MAX      (20)typedef struct {    int id;    char name[AUDIO_NAME_MAX+1];} audio_t, *audio_handle_t;// level 1st#define is_invalid_ptr(_ptr) (_ptr == NULL)// level 2nd#define is_invalid_handle(_handle) ((_handle == NULL) || ((_handle)->id != AUDIO_DEVICE_ID))int main(){    void* lptr = NULL;    audio_t audio;    audio_handle_t p_audio = &audio;    // level 1st    if (is_invalid_ptr(lptr)) {        printf("this ptr is invalid.\r\n");    }    // level 2nd    // use case 1:    if (is_invalid_handle(p_audio)) {        printf("this handle != NULL, but lost right Id.\r\n");    }    // use case 2:    p_audio->id = AUDIO_DEVICE_ID;    if (!is_invalid_handle(p_audio)) {        printf("this handle != NULL, and own right Id.\r\n");    }    // use case 3:    p_audio = NULL;    if (is_invalid_handle(p_audio)) {        printf("this handle == NULL.\r\n");    }    return 0;}/*运行结果如下:this ptr is invalid.this handle != NULL, but lost right Id.this handle != NULL, and own right Id.this handle == NULL.Process returned 0 (0x0)   execution time : 0.188 sPress any key to continue.*//* 注释: *环境:code::block, gcc, gdb; *讨论:使用宏定义进行错误判定; *意义:1.使代码更清晰明了,少一行代码,会不会更环保?被陈皓的coolshell洗脑了;        2.在项目过程中,经常需要对指针进行判断,比如有如下两个设备类型需要注册typedef struct {    int id;    char name[NAME_MAX];}device_t, device_handle_t;static device_t audio_device;static device_t key_device;在我的初级阶段使用中,可能需要做如下判定:int foo(type arg, type *_p_arg) {    device_handle_t p_audio = &audio_device;    device_handle_t p_key   = &key_device;    if(NULL != p_audio || AUDIO_DEVICE_ID != (p_audio->id)) {        return ERROR_T(AUDIO_DEVICE);    }    ......    if(NULL != p_key || KEY_DEVICE_ID != (p_key->id)) {        return ERROR_T(KEY_DEVICE);    }    ......}如果使用宏,代码组织如下:int foo(type arg, type *_p_arg) {    device_handle_t p_audio = &audio_device;    device_handle_t p_key   = &key_device;    if(is_invalid_handle(p_aduio)) {        return ERROR_T(AUDIO_DEVICE);    }    ......    if(is_invalid_handle(p_key)) {        return ERROR_T(KEY_DEVICE);    }    ......}*//* end of this file */

0 0
原创粉丝点击