是否可以在宏中进行无效检查和访问?
例如:
#define LOG(mystruct, severity, format, ...) ({ \
severity_t current = ERROR; \
if (mystruct) { \
current = mystruct->error_level; \
} \
if (severity >= current) { \
... //handle logging
} \
})
如果我用 LOG(NULL, DEBUG, "test %s", "one");
调用它,我会得到这样的错误:
错误:成员引用基类型“void”不是结构或 union
注意:从宏“LOG”扩展而来
current = mystruct->error_level;
mystruct 定义为:
typedef struct mystruct_t {
severity_t error_level;
}
我想允许使用 NULL mystruct
的可能性。例如:创建结构本身时出现错误的情况。
最佳答案
你的问题是虽然第一个分支永远不会被采用,NULL
没有正确的类型来执行 ->error_level
。
你可以通过给它正确的类型来避免这种情况。我会用局部变量而不是强制转换来做到这一点,这样您就可以捕获宏的错误用例。只需添加
yourType* myStr = mystruct;
current = myStr->error_level;
你应该没问题。
关于结构成员访问的 C99 宏扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32790925/