• #if 和#ifdef的区别


    转自:https://blog.csdn.net/zhangchiytu/article/details/7563329

    先看个例子:
    #define TARGET_LITTLE_ENDINA 1
    #define TARGET_BIG_ENDINA   0

    #ifdef TARGET_LITTLE_ENDINA
    call little endina function
    #else
    call big endina function
    #endif
    不管把 TARGET_LITTLE_ENDINA 和 TARGET_BIG_ENDINA定义成0或者1,甚至后面不写这个0或者1 ,调用的都是little endina函数,这段代码是有问题的,就是没有理解#if和#ifdef之间的区别。


    #if 的使用说明
    #if的后面接的是表达式,如果表达式为1,则编译#if下面的代码

    1 #if (MAX==10)||(MAX==20)
    2 ...code...
    3 #endif

    它的作用是:如果(MAX==10)||(MAX==20)成立,那么编译器就会把其中的#if 与 #endif之间的代码编译进去(注意:是编译进去,不是执行!!

    #ifdef 的说明
    #ifdef 后面接的是一个宏

    1 #ifdef (x)
    2 ...code...
    3 #endif

    这个#ifdef 它不管里面的“x”的逻辑是“真”还是“假”,它只管这个程序前面的宏定义里面有没有定义“x”这个宏(即在这里#define  x 1和#define  x 0等效,都等同于#define x)。

    如果定义了x这个宏,那么编译器会编译中间的…code…否则直接忽视中间的…code…代码。

    #if defined的使用
    #if defined() 的使用和#ifdef的用法一致
    #if !defined()又和 #ifndef 的用法一致。

    最后强调两点:
    第一:这几个宏定义只是决定代码块是否被编译!
    第二:别忘了#endif

    #ifdef 的用法
    灵活使用#ifdef指示符,我们可以区隔一些与特定头文件、程序库和其他文件版本有关的代码。define.cpp文件:

    1 #include "iostream.h"
    2 int main()
    3 {
    4   #ifdef DEBUG 
    5     cout<< "Beginning execution of main()";
    6   #endif 
    7     return 0;
    8 }

    运行结果:Press any key to continue 

    改写代码如下:

    1 #include "iostream.h"
    2 #define DEBUG 
    3 int main()
    4 {
    5     #ifdef DEBUG 
    6     cout<< "Beginning execution of main()";
    7     #endif 
    8     return 0;
    9 } 

    运行结果为:Beginning execution of main()
    Press any key to continue

    更一般的情况是,#define语句是包含在一个特定的头文件中。
    比如,新建头文件head.h,在文件中加入代码:

    1 #ifndef DEBUG
    2 #define DEBUG
    3 #endif

    而在define.cpp源文件中,代码修改如下:

    1 #include "iostream.h"
    2 #include "head.h" 
    3 int main()
    4 {
    5     #ifdef DEBUG 
    6     cout<< "Beginning execution of main()";
    7     #endif 
    8     return 0;
    9 } 

    运行结果如下:Beginning execution of main()
    Press any key to continue 
    结论:通过使用#ifdef指示符,我们可以区隔一些与特定头文件、程序库和其他文件版本有关的代码。

    ================================================================================

    为各个版本的软件升级工作是很困难的,因为这些补丁程序都是在一套软件的基础上不断地修改与扩充而编写的,并由不同的标志文件转入到不同的模块,虽然程序 体积在不断扩大,但丝毫不影响老用户的功能,这主要是得益于C程序的#ifdef/#else/#endif的作用。

    我们主要使用以下几种方法,假设我们已在程序首部定义#ifdef DEBUG与#ifdef TEST:

    1.利用#ifdef/#endif将某程序功能模块包括进去,以向某用户提供该功能。

      在程序首部定义#ifdef HNLD:

    1 #define HNLD
    2 
    3 #ifdef HNLD
    4 #include"n166_hn.c"
    5 #endif

      如果不许向别的用户提供该功能,则在编译之前将首部的HNLD加一下划线即可。

    2.在每一个子程序前加上标记,以便追踪程序的运行。

    1 #ifdef DEBUG
    2   printf(" Now is in hunan !");
    3 #endif

    3.避开硬件的限制。有时一些具体应用环境的硬件不一样,但限于条件,本地缺乏这种设备,于是绕过硬件,直接写出预期结果。具体做法是:

    1 #ifndef TEST
    2   i=dial();  //程序调试运行时绕过此语句
    3else
    4   i=0;
    5 #endif

    调试通过后,再屏蔽TEST的定义并重新编译,即可发给用户使用了。

    明白了之间的区别问题就变得非常的容易,修改上述代码只要把其中的#ifdef改成#if就可以达到目的。

  • 相关阅读:
    博客添加点线粒子
    获取微信公众号音乐
    Linux 命令汇总
    Hbase 数据导入导出
    scala SimpleDateFormat
    shell 日期加减运算
    selenium获取全部页面的html
    关于EEG参考电极
    反相器和晶振做振荡
    HC系列蓝牙模块连接单片机与电脑,传输数据(蓝牙心电测试)
  • 原文地址:https://www.cnblogs.com/computer1-2-3/p/11961796.html
Copyright © 2020-2023  润新知