【发布时间】:2015-03-01 09:19:36
【问题描述】:
从http://c-faq.com/style/strcmp.html,我学到了以下便利宏:
#define Streq(s1, s2) (strcmp((s1), (s2)) == 0)
我想知道为什么在这个宏中使用了这么多括号。每个括号是有目的的,还是这个宏使用了没有目的的多余括号?
我们可以去掉s1 和s2 周围的括号,然后做一个这样的宏吗?
#define MyStreq(s1, s2) (strcmp(s1, s2) == 0)
MyStreq 宏对我来说似乎和Streq 一样好用。
#include <string.h>
#include <stdio.h>
#define Streq(s1, s2) (strcmp((s1), (s2)) == 0)
#define MyStreq(s1, s2) (strcmp(s1, s2) == 0)
int main()
{
printf("%d %d\n", Streq("foo", "foo"), MyStreq("foo", "foo"));
printf("%d %d\n", Streq("fox", "foo"), MyStreq("fox", "foo"));
printf("%d %d\n", Streq("foo", "fox"), MyStreq("foo", "fox"));
return 0;
}
以上代码的输出:
1 1
0 0
0 0
您能想象这些宏的任何用法,其中Streq 会执行预期的操作,而MyStreq 不会?
【问题讨论】:
标签: c macros c-preprocessor parentheses