如何在宏中写出这样的条件?

时间:2016-08-24 14:17:00

标签: c macros c-preprocessor

我对宏很陌生 我知道如何使用三元运算符条件 如何将其转换为#define

if(i==j)
            {
                count=count+1;
                break;
            }

我试试这个运气但似乎错了:

#define ifcount(i,j) ((i)==(j)? count=count+1\
                                    break:0)

这是我想要转换的代码 http://pastebin.com/i7Tuyh00

2 个答案:

答案 0 :(得分:2)

使用(滥用)宏来改变程序的流程通常是一个坏主意,因为读取代码的人(自己在几年内)可能会对程序流中的意外跳转感到惊讶。

那就是说,你的问题与三元运算符无关。实际上,三元运算符的右侧不能包含中断,只能包含表达式。

但宏是全能的,所以你可以这样做:

#define ifcount(i,j) if ((i)==(j)) { count=count+1; break; }

这个宏的主要问题是人们在使用它时会写;,如果在另一个if /else对之间使用它,它会破坏,没有大括号:

if (...)
    ifcount(a,b);
else // <--- syntax error because the previous ; breaks the if /else relation
    ...;

标准解决方案是使用do/while(0)成语:

#define do { ifcount(i,j) if ((i)==(j)) { count=count+1; break; } } while (0)

但这不起作用,因为break会打破这个内部while,而不是你想要的那个(信用到@abelenky)。

允许复合语句并以;结尾的唯一其他C语句就是这个:

#define ifcount(i,j) if ((i)==(j)) { count=count+1; break; } else

问题是,如果您在使用;时忘记添加ifcount(i,j),而不是编译器错误,您将获得静默编译并且行为方式出人意料地改变。

答案 1 :(得分:0)

我认为没有必要使用三元(?:)运算符 所以这是使用if语句的宏。

#define IfCount(i,j) if ((i)==(j)) { count++; break; }

<强>用法:

IfCount(x,5);

好的,你们怎么看待这个?

#define IfCount(i,j) if ((i)==(j)) { count++; break; } do{}while(0)

最终的,孤立的do-while-0有两个目的:

  • 它是一个悬挂分号的地方,因此宏用法看起来像“普通”C并以分号结尾。
  • 之后会阻止无意的else语句,因为语法do{}while(0) else无效。

还有什么需要照顾的吗?