2014-09-12 27 views
0

当* 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 
+3

你是什么意思的“定义”? – Medinoc 2014-09-12 19:35:54

+2

如果你没有声明**你正在尝试使用的变量,你的编译器会吐出一个错误。你所做的只有在'a!= 0'时才会生效。这是你所说的“定义”的意思吗? – DevNull 2014-09-12 19:38:29

+0

按定义我的意思是它是NULL。如果customer_number为NULL,那么* customer_number也不应该为NULL? – caaruiz 2014-09-12 19:53:39

回答

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。当为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);} 

如果实际上是一个指向指针的指针,那么您需要首先验证不为NULL,然后验证*customer_number不为NULL。

相关问题