我有以下宏:
#define IF_TRACE_ENABLED(level) if (IsTraceEnabled(level))
用户代码应如下所示:
IF_TRACE_ENABLED(LEVEL1)
{
... some very smart code
}
这里强调大括号 - 我想阻止“if”从宏到“吃掉”其他代码:
if (...)
IF_TRACE_ENABLED(LEVEL1)
printf(....);
else
bla bla bla
在此示例中,IF_TRACE_ENABLED
“吃掉”其他块。
是否有办法强制用户代码在没有卷曲制动的情况下编译或者还有其他定义宏来实现安全性?
答案 0 :(得分:11)
这不会强制宏的用户使用大括号,但它会阻止else
子句无意中被吃掉:
#define IF_TRACE_ENABLED(level) if (!IsTraceEnabled(level)) {} else
附注:问题第二个示例中printf()
周围的大括号无法解决问题 - 与else
关联的bla bla bla
仍会绑定到if
宏中的{1}}语句。
答案 1 :(得分:2)
你可以试试这个:
#define IF_TRACE_ENABLED(level) do { if(IsTraceEnabled(level)) {
#define END_TRACE_ENABLED } } while(0);
我认为没有办法从宏的开头行“强制执行”良好的语法。你需要使用两个。
修改强>
我在宏中添加了一对额外的括号,以避免出现歧义。
在回应评论时,这个宏应该像这样使用:
IF_TRACE_ENABLED(LEVEL1)
printf("Trace\n");
END_TRACE_ENABLED
不作为陈述。为了记录,我认为这是对预处理器的滥用,没有人应该这样做。写出来有什么问题,必要时用#ifdef DEBUG
括起来。
答案 2 :(得分:0)
这应该可行,但你也可以将if块的内容作为参数传递给宏:
#define IF_TRACE_ENABLED(level,content) { if (IsTraceEnabled(level)) {content} }