我有一个定义如下的宏。同样在我的程序中,我需要打印出两种样式的错误消息:
PRINT_ERR("This is Error!");
char *log = NULL;
int age = 0;
asprintf(&log, "error: %s on: %d", "Name", age);
PRINT_ERR(log);
使用下面的宏定义,样式#1将抛出异常。 所以,在宏定义中,我如何弄清楚在哪种情况下,我需要释放字符串" y"?
#define PRINT_LOG(x, y) { \
printf ( "%s: %s\n", x, y);\
free(y);\ //how do I know "y" is a pointer, or a string like this "string"?
}
#define PRINT_ERR(y) { PRINT_LOG ("ERR ", y) }
答案 0 :(得分:3)
你不能使用两个不同的宏 - 沿着下面的行吗?
#define PRINT_ERR(y) ....
#define PRINT_ERR_FREE(y) \
do { \
PRINT_ERR(y); \
free(y);\
} while (0);
答案 1 :(得分:2)
你的宏/函数/无论无法区分字符串文字和动态分配字符串,因此,你不能总是free()
字符串参数,因为字符串文字不能是{{1 }}倒是。
一个简单的解决方案是编写可变参数函数(或者如果您更喜欢,还可以使用可变参数宏):
free