在写#error之前顺便学习习其他预定义的方法
如#ifdef #else #endif #ifndef等(英语不好,打印的提示不规范,勿笑话)
有如下程序
int main(void)
{
#ifdef ABC
printf("111 有宏定义 ABC\n");
#else
printf("222 没有宏定义 ABC\n");
#endif
return 0;
}
输出结果:222 没有宏定义 ABC
下面我们将上面的预处理逻辑修改下:
int main(void)
{
#ifndef ABC
printf("111 没有宏定义 ABC\n");
#else
printf("222 有宏定义 ABC\n");
#endif
return 0;
}
输出结果:111 没有宏定义 ABC
请仔细看上面的预处理,一个是#ifdef 一个是#ifndef 通过上面的例子可以很清楚的理解,上面的两个例子是都没有宏定义ABC的情况
下面我们将在上面的例子修改下,加上宏定义
#define ABC 666int main(void){#ifndef ABCprintf("111 没有宏定义 ABC\n");#elseprintf("222 有宏定义 ABC\n");#endifreturn 0;}
输出结果:222 有宏定义 ABC
其他的预处理类似
下面介绍下#error的用法,比较特殊
编译程序时,只要遇到 #error 就会跳出一个编译错误,既然是编译错误,要它干嘛呢?其目的就是保证程序是按照你所设想的那样进行编译的。
下面举个例子:
程序中往往有很多的预处理指令
#ifdef XXX
...
#else
#endif
当程序比较大时,往往有些宏定义是在外部指定的(如makefile),或是在系统头文件中指定的,当你不太确定当前是否定义了 XXX 时,就可以改成如下这样进行编译:
#ifdef XXX
...
#error "XXX has been defined"
#else
#endif
这样,如果编译时出现错误,输出了XXX has been defined,表明宏XXX已经被定义了。
那么还是以上面的为例子
int main(void)
{
#ifndef ABC
#error "111 没有宏定义 ABC\n"
#else
#error "222 有宏定义 ABC\n"
#endif
return 0;
}因为没有宏定义ABC,因此编译的时候会出现下面的错误
.\CAndPoint\main.cpp:14:10: error: #error "111 没有宏定义 ABC\n"
#error "111 没有宏定义 ABC\n
同理:也可以试下有宏定义的时候的情况
#define ABC 666
int main(void)
{
#ifndef ABC
#error "111 没有宏定义 ABC\n"
#else
#error "222 有宏定义 ABC\n"
#endif
return 0;
}
#error "222 有宏定义 ABC\n"
对了,突然想起来还有一个常用的#undef,也顺便介绍下
作用:用来将前面定义的宏标识符取消定义
这里举一个最简单的例子,当然还有在复杂数据类型或者函数接口等使用可以参考其他资料
#define ABC 666
int main(void)
{
#undef ABC
int ABC = 888;
printf("ABC=%d\n",ABC);
return 0;
}
输出结果为:ABC=888
有的人要问了,这样也可能是因为后面重新定义把ABC的值给修改了,那么我们再做一个实验
#define ABC 666
int main(void)
{
#undef ABC
//int ABC = 888;
printf("ABC=%d\n",ABC);
return 0;
}
这时会编译报错:main.cpp:16:23: error: 'ABC' was not declared in this scope
这个报错信息很明显,ABC未定义
当然预处理还有很多,有需要或者有兴趣的可以继续深入研究