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

 #ifdef USE_STDPERIPH_DRIVER
#include "stm32f4xx_conf.h"
#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)

 #define IFTEST1        0
#define IFTEST2 1 int main()
{
#ifdef IFTEST1
printf("ifdef: %d\n", IFTEST1);
#else
printf("ifdef: not defined!\n");
#endif
return ;
}

2)

 //#define IFTEST1        0
#define IFTEST2 1 int main()
{
#ifdef IFTEST1
printf("ifdef: %d\n", IFTEST1);
#elif
printf("ifdef: not defined!\n");
#endif
return ;
}

编译出错:

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

总结出来的点为:

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

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

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

示例说明:

 #define IFTEST1        0
#define IFTEST2 1 int main()
{
#if IFTEST1 //为假,不执行
printf("if : %d\n", IFTEST1);
#elif IFTEST2 //为真,执行
printf("if : %d!\n", IFTEST2);
#else
printf("if : not true!\n");
#endif
return ;
}

#if和#ifdef的区别的更多相关文章

  1. #if 和#ifdef的区别

    转自:https://blog.csdn.net/zhangchiytu/article/details/7563329 先看个例子:#define TARGET_LITTLE_ENDINA 1#de ...

  2. C 和 Object-C中的 #ifdef #ifndef

    很多宏是为了进行条件编译.一般情况下,源程序中所有的行都参加编译.但是有时希望对其中一部分内容只在满足一定条件才进行编译,也就是对一部分内容指定编译的条件,这就是“条件编译”.有时,希望当满足某条件时 ...

  3. darknet是如何对数据集做resize的?

    在准备数据集时,darknet并不要求我们预先对图片resize到固定的size. darknet自动帮我们做了图像的resize. darknet训练前处理 本文所指的darknet版本:https ...

  4. #ifdef 和 #if defined 的区别 -- 转

    #ifdef 和 #if defined 的区别在于,后者可以组成复杂的预编译条件,比如 #if defined (AAA) && defined (BBB) xxxxxxxxx #e ...

  5. #if 与 #ifdef 之间的区别

    先来看个例子: #define TARGET_LITTLE_ENDINA 1 #define TARGET_BIG_ENDINA 0 #ifdef TARGET_LITTLE_ENDINA call ...

  6. #ifdef 和 #if defined的区别

    #ifdef 和 #if defined的区别在于,后者可以组成复杂的预编译条件,比如 #if defined (AAA) && defined (BBB)xxxxxxxxx#endi ...

  7. #if、#ifdef、#if defined之间的区别【转】

    转自:http://quanminchaoren.iteye.com/blog/1870977 #if的使用说明 #if的后面接的是表达式 #if (MAX==10)||(MAX==20) code. ...

  8. C开发之----#if、#ifdef、#if defined之间的区别

    #if的使用说明 #if的后面接的是表达式 #if (MAX==10)||(MAX==20) code... #endif 它的作用是:如果(MAX==10)||(MAX==20)成立,那么编译器就会 ...

  9. #if和#ifdef区别

    #if  是要去判断, 跟值有关 #ifdef  只要定义了即可, 就会走下面的代码, 不管值是0还是1 所以一般都是用#ifdef DEBUG调试

随机推荐

  1. mybatis自定义代码生成器(Generator)——自动生成model&dao代码

    花了两天的时间研究了下mybatis的generator大体了解了其生成原理以及实现过程.感觉generator做的非常不错,给开发者也留足了空间.看完之后在generator的基础上实现了自定义的生 ...

  2. linux下错误的捕获:errno(errno.h)和strerror(string.h)的使用

    参考:http://blog.csdn.net/starstar1992/article/details/52756387 linux下错误的捕获:errno和strerror的使用 经常在调用lin ...

  3. 闪回工具flashback

    Ⅰ.背景 早先操作数据误操作后,我们一般通过全量备份+binlog的方式来实现恢复(前滚) 有时只想撤销一个几分钟前的操作,采用这种方式就会显得很笨重 大家都知道Oracle有个叫做flashback ...

  4. .NET Core 获取操作系统各种信息

    .NET Core 获取操作系统各种信息 一.前言 .NET Core 内置了一些API供我们获取操作系统.运行时.框架等信息.这些API不是很常用,所有有些小伙伴可能还不知道,这里做一些可能用到的获 ...

  5. traceback模块

    traceback模块被用来跟踪异常返回信息 如下例所示: import traceback try: raise SyntaxError, "traceback test" ex ...

  6. 判断qq号码 规律

    $qqs = array('2343232', "4323254","22222","5123123","23412341234& ...

  7. Python反序列化 pickle

    # 若需要处理更复杂的数据, 用pickle. pickle只有在Python里能用, 其它语言不行. # 序列化. import pickle def sayhi(name): print('hel ...

  8. 转载:python + requests实现的接口自动化框架详细教程

    转自https://my.oschina.net/u/3041656/blog/820023 摘要: python + requests实现的接口自动化框架详细教程 前段时间由于公司测试方向的转型,由 ...

  9. java面向对象中四种权限(private,protected,public,友好型)详解

    转自http://blog.csdn.net/a1237871112/article/details/50926975 及http://blog.csdn.net/blackmanren/articl ...

  10. 【链表】Bzoj1098[POI2007]办公楼biu

    Description FGD开办了一家电话公司.他雇用了N个职员,给了每个职员一部手机.每个职员的手机里都存储有一些同事的电话号码.由于FGD的公司规模不断扩大,旧的办公楼已经显得十分狭窄,FGD决 ...