#error指令错误宏是错误的

时间:2015-08-22 21:50:25

标签: 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)
#error(index) fprintf(stderr, "Range error: index = %d\n",index)
int main(void)
{
/*char s[5];
int i;
strcpy(s,"abcd");
i = 0;
putchar(s[++i]);*/
int i = CHECK(10,50,45);
    printf("%d",i);
  return 0;
}

我尝试做一个带参数的错误输入,因为宏可以这样做但是当我尝试构建和编译时我收到此错误消息
#error (index) fprintf(stderr, "Range error: index = %d\n",index)
我可以在错误指令或fprintf中有一个参数 或者什么是错的?

1 个答案:

答案 0 :(得分:1)

  

我尝试进行带参数的错误输入,因为宏可以这样做

首先,#error不是宏。这是一个directive。因此它由预处理器处理。意思是,它只能在编译时工作。换句话说,它不能在运行时使用,比如在if语句之后。这也解释了你,至少逻辑上,不能要求参数,因为预处理器不知道如何处理它。

其次,由于您似乎开始学习预处理器,我会告诉您它所做的一切都是简单的替换。实际上,您可以看到源文件的最终形式,因为编译器会使用-E gcc选项查看它。例如:

#define BIGGER(x,y) (x > y ? x : y)

int main(void) {
    int num = BIGGER(3, 7); // 7
}

现在,所有编译器都看到了:

int main(void) {
    int num = (3 > 7 ? 3 : 7);
}

我希望这能澄清你的困惑。