经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C 语言 » 查看文章
#if和#ifdef的区别
来源:cnblogs  作者:xbook_ben  时间:2019/4/30 8:51:08  对本文有异议

学习STM32偶然发现:在Keil中直接预先定义宏USE_STDPERIPH_DRIVER,但是却没有指定宏的值。而在头文件中判断用的是如下代码:

  1. 1 #ifdef USE_STDPERIPH_DRIVER
  2. 2 #include "stm32f4xx_conf.h"
  3. 3 #endif /* USE_STDPERIPH_DRIVER */

由此引发对#if和#ifdef的思考:这两者有什么区别?

1、#ifdef指令说明:如果预处理器已经定义了后面的标识符,那么执行所有指令并编译C代码,直到下一个#else或者#endif出现为止(无论#else和#endif谁先出现)。如果有#else指令,那么,在未定义标识符时会执行#else和#endif之间的所有代码。(C Primer Plus中文版(第五版) 人民邮电出版社 P460)

从以上的说明中可以总结以下几点:

1)#ifdef只是判断后面的标识符有没有定义,而不在乎标识符的值,标识符是0是1对它来说都没有区别,只要预先定义了,执行#ifdef后的代码;

2)#ifdef是和#else搭配使用的,没有#elif搭配之说;

3)#ifdef必须要有#endif配合使用;

示例说明:

1)

  1. 1 #define IFTEST1 0
  2. 2 #define IFTEST2 1
  3. 3
  4. 4 int main()
  5. 5 {
  6. 6 #ifdef IFTEST1
  7. 7 printf("ifdef: %d\n", IFTEST1);
  8. 8 #else
  9. 9 printf("ifdef: not defined!\n");
  10. 10 #endif
  11. 11 return 0;
  12. 12 }

2)

  1. 1 //#define IFTEST1 0
  2. 2 #define IFTEST2 1
  3. 3
  4. 4 int main()
  5. 5 {
  6. 6 #ifdef IFTEST1
  7. 7 printf("ifdef: %d\n", IFTEST1);
  8. 8 #elif
  9. 9 printf("ifdef: not defined!\n");
  10. 10 #endif
  11. 11 return 0;
  12. 12 }

编译出错:

 

2、#if说明:#if指令更像常规的C中的if,#if后跟常量整数表达式。如果表达式为非零值,则表达式为真。在该表达式中可以使用C的关系运算符和逻辑运算符。且可以使用#elif指令扩展if-else序列(C Primer Plus中文版(第五版) 人民邮电出版社 P462)

总结出来的点为:

1)#if是要判断它后面表达式真假的,是真才执行#if后的代码;

2)#if和#elif搭配使用,这就可以用多种条件编译选择;

3)#if也是必须要以#endif配合使用。

示例说明:

  1. 1 #define IFTEST1 0
  2. 2 #define IFTEST2 1
  3. 3
  4. 4 int main()
  5. 5 {
  6. 6 #if IFTEST1 //为假,不执行
  7. 7 printf("if : %d\n", IFTEST1);
  8. 8 #elif IFTEST2 //为真,执行
  9. 9 printf("if : %d!\n", IFTEST2);
  10. 10 #else
  11. 11 printf("if : not true!\n");
  12. 12 #endif
  13. 13 return 0;
  14. 14 }

 

原文链接:http://www.cnblogs.com/xbook-ben/p/10790092.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号