使用类似函数的宏来检查是否定义了变量

时间:2014-09-12 19:31:59

标签: c macros segmentation-fault

当* customer_num为NULL时,以下宏会导致段错误。

#define SAVE(a,b,c) if(a){stchar(a,b,c);}

在宏中有一种方法可以检查是否已定义,如果没有,则只使用NULL。 如果我只使用NULL,宏就可以工作,如下所示。

SAVE(NULL,buf,16);


1)save_cust(NULL);
2)save_cust(char **customer_number,..etc);
3)SAVE(*customer_number,buf,16); //causes seg fault since it *customer_number is undefined

1 个答案:

答案 0 :(得分:0)

鉴于此宏

#define SAVE(a,b,c) if(a){stchar(a,b,c);}

以及以下调用

SAVE(*customer_number,buf,16);

预处理器的输出是

if (*customer_number){stchar(*customer_number,buf,16);}

结果是你没有检查customer_number是否为NULL,而是检查*customer_number是否为NULL。当customer_number为NULL时,检查*customer_number会导致seg_fault。

问题的一个解决方案是将宏定义为

#define SAVE(a,b,c) if(a){stchar(*a,b,c);}

然后调用宏

SAVE(customer_number,buf,16);

经过进一步审核,我认为您正在寻找的宏是

#define SAVE(a,b,c) if(a && *a){stchar(*a,b,c);}

如果customer_number实际上是指向指针的指针,则需要首先验证customer_number不是NULL,然后验证*customer_number不是NULL。