Astyle with --remove-bracket和一个宏

时间:2014-10-31 12:38:15

标签: c astyle

使用代码:

#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的错误还是我的误解?

2 个答案:

答案 0 :(得分:4)

这是一种糟糕的风格。

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

#define MACRO(A,B) do { foo(A); bar(B); } while(0) 

答案 1 :(得分:1)

由于多种原因,类似函数的宏总是很糟糕。类型安全性差,难以阅读,难以调试/维护,非常容易出错,会导致程序出现各种定义不明确的行为,等等。

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

如果你总是使用大括号,那么在编写宏时你不需要使用各种模糊的技巧。

好风格:

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

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