0

使用代码:

#define MACRO(A,B) foo(A); bar(B)

if(true) {
    MACRO(A,B);
}

Astyle 将删除宏调用周围的括号

if(true)
    MACRO(A,B);

幸运的是,我找到了解决方案。如果我把;宏放在里面,Astyle 就会明白。

#define MACRO(A,B) foo(A); bar(B);

if(true) {
    MACRO(A,B)
}

这是一个好的解决方案,是Astyle的错误还是我的误解?

4

2 回答 2

4

这是一种糟糕的风格。

如果您绝对必须在宏中包含多个语句,请将它们包装在do while循环中(注意末尾缺少分号):

#define MACRO(A,B) do { foo(A); bar(B); } while(0) 
于 2014-10-31T12:42:06.133 回答
1

出于多种原因,类似函数的宏总是不好的风格。类型安全性差,难以阅读,难以调试/维护,极易出错,使程序面临各种定义不明确的行为等等。

没有大括号的控制或循环语句是危险的风格,因为它使程序容易受到许多难以置信的常见错误的影响。有些人会争辩说“没有大括号使代码更具可读性”(我自己曾经参加过这个阵营),然后他们会因此而跳过编写错误。没有大括号总是迟早会导致错误。

而且如果你总是使用大括号,那么你在编写宏时就不需要使用各种晦涩难懂的技巧了。

好作风:

void function (type A, type B)
{
  foo(A);
  bar(b)
}

if(true) 
{
  function(A, B);
}
于 2014-10-31T12:51:25.127 回答