结构成员访问的 C99 宏扩展

标签 c macros c99 variadic-macros

是否可以在宏中进行无效检查和访问?

例如:

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

相关文章:

c - 如何找到数组的大小(从指向数组第一个元素的指针)?

c - Matlab MEX 文件 - 索引正确,UINT32 值不正确

c - C 中的绑定(bind)变量?

macros - 为什么此宏会导致未解析的名称错误?

c - 从左到右将2个大数相加

chdir() 可以接受相对路径吗?

c++ - 真值表到位表达式

c++ - 为什么 CERT 标准 PRE00-CPP 说 "Avoid defining macros"

c - Visual Studio C 函数语法错误

c - 为什么使用 "designated initializer"初始化 C union 会给出随机值?