C语言#ifdef,#else,#ifndef,#error等用法

在写#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 666
int main(void)
{
    #ifndef ABC
    printf("111 没有宏定义 ABC\n");
    #else
    printf("222 有宏定义 ABC\n");
    #endif
   return 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;
}
..\CAndPoint\main.cpp:16:10: error: #error "222 有宏定义 ABC\n"

#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未定义


当然预处理还有很多,有需要或者有兴趣的可以继续深入研究



  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值