检查区间范围内的宏的宏

时间:2015-08-17 16:34:54

标签: c macros c-preprocessor

#include <stdio.h>
#include <stdbool.h>
#include <ctype.h>
#define CHECK(x,y,n) (x > 0 && x < n && y > 0 && y < n ? 1 : 0))
int main(void)
{
/*char s[5];
int i;
strcpy(s,"abcd");
i = 0;
putchar(s[++i]);*/
int i = CHECK(2,3,10);
    printf("%d",i);
  return 0;
}

我想声明一个宏来检查两个值x和y是否在区间中但是当我尝试编译和构建时,我从编译器中得到这些错误:

line 4 error: expected ',' or ';' before ';' ')' token

4 个答案:

答案 0 :(得分:2)

宏中有一个额外的)。无论如何,我建议将括号中的所有宏参数括起来,以避免优先级问题和其他一些宏观陷阱:

 #define CHECK(x,y,n) ((x) > 0 && (x) < (n) && (y) > 0 && (y) < (n) ? 1 : 0)

答案 1 :(得分:1)

简而言之,不要!

函数几乎总是比宏更好:

  • 类型检查和更好的编译器警告
  • 几乎总是很快
  • 更具可读性
  • 易于调试,添加跟踪点
  • 可能与您的IDE更好地配合

如果需要,可以将其设为静态,以保持名称私密。 如果需要,可以将其设置为静态内联以允许在头文件中使用。

答案 2 :(得分:0)

   #define CHECK(x,y,n) (x > 0 && x < n && y > 0 && y < n ? 1 : 0))
                                                                 ^extra ')'                

答案 3 :(得分:0)

问题的核心是宏观检查&#39;

这是该程序的更正版本,带有注释

#include <stdio.h>
// #include <stdbool.h> // not needed for posted code
// #include <ctype.h>   // not needed for posted code

// notice the parens around the condition
// notice the end of the action part of the macro only has
//        a single paren, to match the opening paren
//        at the beginning of the action part of the macro
#define CHECK(x,y,n) ( (x > 0 && x < n && y > 0 && y < n) ? 1 : 0)

int main(void)
{
    /*char s[5];
    int i;
    strcpy(s,"abcd");
    i = 0;
    putchar(s[++i]);*/

    int i = CHECK(2,3,10);
    printf("%d",i);
    return 0;
} // end function: main

结果干净地编译并执行所需的操作

注意适当的代码缩进

indent after every opening brace '{'
un-indent before every closing brace '}'