c - 使用类函数宏检查变量是否已定义

标签 c macros segmentation-fault

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

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

在宏中,有没有一种方法可以检查 a 是否已定义,如果没有,则使用 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

最佳答案

鉴于此宏

#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。

关于c - 使用类函数宏检查变量是否已定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25815526/

相关文章:

c - 分配连续物理内存的方法

c++ - 带 flex 的正则表达式

java - SAS 语言提供的宏编程有什么好处?

c - 如何在宏中使用##?

c - 宏未编译

C++ 将结构中的 char* 数据复制到另一个结构

C段错误打印二维数组

c - assembly - 来自堆栈的编号

c++ - C/C++ 中的套接字编程 - 接收由 typedef 结构定义的消息

c - 程序尝试写出结果时出现段错误