#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中有一个参数
或者什么是错的?
答案 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);
}
我希望这能澄清你的困惑。