使用代码:
#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的错误还是我的误解?
答案 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);
}