1、基本概念

  条件编译的行为类似于C语言中的if…else…

  条件编译是预编译指示命令,用于控制是否编译某段代码

2、实例分析

条件编译初探     22-1.c

 #include <stdio.h>  
  
#define C 1  
  
int main()  
{  
    const char* s;  
  
    #if( C == 1 )  
        s = "This is first printf...\n";  
    #else  
        s = "This is second printf...\n";  
    #endif  
  
    printf("%s", s);  
      
    return ;  
}  

3、条件编译的本质

  预编译器根据条件编译指令有选择的删除代码

  编译器不知道代码分支的存在

  if. .. else ... 语句在运行期进行分支判断

  条件编译指令在预编译期进行分支判断

  可以通过命令行定义宏

 -  gcc -Dmacro=value file.c 或 gcc -Dmacro file.c

4、#include的本质

  #include的本质是将已经存在的文件内容嵌入到当前文件中

  #include的间接包含同样会产生嵌入文件内容的操作

如何解决间接包含同—个头文件产生编译错误?

解决方案:

 #ifndef _HEADER_FILE H   
  
#define _HEADER_FILE H   
  
  // source code   
  
#endif   

5、实例分析

条件编译的使用

global.h

 // global.h  
#ifndef _GLOBAL_H_  
#define _GLOBAL_H_  
int global = ;  
  
#endif  

test.h

 // test.h  
  
#ifndef _TEST_H_  
#define _TEST_H_  
#include "global.h"  
  
const char* NAME = "test.h";  
char* hello_world()  
{      
    return "Hello world!\n";  
}  
  
#endif  

22-3.cpp

 //#include <stdio.h>  
#include "test.h"  
#include "global.h"  
  
int main()  
{  
    const char* s = hello_world();  
    int g = global;  
      
    // printf("%s\n", NAME);  
    // printf("%d\n", g);  
      
    return ;  
}  

条件编译可以解决头文件重复包含的编译错误

7、条件编译的意义

  条件编译使得我们可以按不同的条件编译不同的代码段,因而可以产生不同的目标代码

  #if…#else…#endif被预编译器处理,而if…else .. 语句被编译器处理,必然被编译进目标代码

实际工程中条件编译主要用于以下两种情况:

-不同的产品线共用一份代码

-区分编译产品的调试版和发布版

8、实例分析

产品线区分及调试代码应用     product.h     22-4.c

product.h

 #define DEBUG 1  //调试版
#define HIGH  1  //高端产品

22-4.c

 #include <stdio.h>  
#include "product.h"  
  
#if DEBUG  
    #define LOG(s) printf("[%s:%d] %s\n", __FILE__, __LINE__, s)  
#else  
    #define LOG(s) NULL  
#endif  
  
#if HIGH  
void f()  
{  
    printf("This is the high level product!\n");  
}  
#else  
void f()  
{  
}  
#endif  
  
int main()  
{  
    LOG("Enter main() ...");  
      
    f();  
      
    printf("1. Query Information.\n");  
    printf("2. Record Information.\n");  
    printf("3. Delete Information.\n");  
      
    #if HIGH  
    printf("4. High Level Query.\n");  
    printf("5. Mannul Service.\n");  
    printf("6. Exit.\n");  
    #else  
    printf("4. Exit.\n");  
    #endif  
      
    LOG("Exit main() ...");  
      
    return ;  
}  

9、小结

通过编译器命令行能够定义预处理器使用的宏

条件编译可以避免围复包含头同—个头文件

条件编译是在工程开发中可以区别不同产品线的代码

条件编译可以定义产品的发布版和调试版

C语言-条件编译使用分析的更多相关文章

  1. (五)c语言条件编译#ifdef与#if defined

    c语言条件编译#ifdef与#if defined defined NAME是用来判断NAME是否被定义了(被用define定义了). #ifdef NAME == #if defined(NAME) ...

  2. 利用R语言打造量化分析平台

    利用R语言打造量化分析平台 具体利用quantmod包实现对股票的量化分析 1.#1.API读取在线行情2.#加载quantmod包3.if(!require(quantmod)){4. instal ...

  3. R语言重要数据集分析研究——需要整理分析阐明理念

    1.R语言重要数据集分析研究需要整理分析阐明理念? 上一节讲了R语言作图,本节来讲讲当你拿到一个数据集的时候如何下手分析,数据分析的第一步,探索性数据分析. 统计量,即统计学里面关注的数据集的几个指标 ...

  4. c语言条件编译#ifdef与#if defined

    c语言条件编译#ifdef与#if defined   c语言条件编译#ifdef与#if defined 摘自:https://www.cnblogs.com/zhangshenghui/p/566 ...

  5. Go语言的前景分析

    本文为原创文章,转载注明出处,asdfasdfasdf 欢迎扫码关注公众号flysnow_org或者网站http://www.flysnow.org/,第一时间看后续精彩文章.觉得好的话,顺手分享到朋 ...

  6. Go将统治下一个10年?Go语言发展现状分析

    “本文是国内Go语言大中华区首席布道师——许式伟,在QCon2015上海站上的分享.他预测Go语言10年内一定会超过C和java,并且统治这一个10年. Go语言语法及标准库变化 Go从1.0版本到现 ...

  7. 猴子吃桃问题之《C语言经典案例分析》

    猴子吃桃问题之<C语言经典案例分析>一.[什么是猴子吃桃]       猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个.第二天早上又将第一天剩下的桃子吃掉一半 ...

  8. Go语言源码分析之unsafe

    Go语言源码分析之unsafe 1.什么是unsafe unsafe 库让 golang 可以像C语言一样操作计算机内存,但这并不是golang推荐使用的,能不用尽量不用,就像它的名字所表达的一样,它 ...

  9. Go语言的堆栈分析

    本文为理解翻译,原文地址:http://www.goinggo.net/2015/01/stack-traces-in-go.html Introduction 在Go语言中有一些调试技巧能帮助我们快 ...

随机推荐

  1. vue(七)--监听属性(watch)

    1.watch:用来监听每一个属性的变化 2.watch这个对象里面都是函数,函数的名称是data中的属性名称,watch中的函数不需要调用 3.当属性发生改变那么就会触发watch函数,每个函数都会 ...

  2. 浅谈python的第三方库——numpy(一)

    python作为广受欢迎的一门编程语言,其中很重要的一个原因便是它可以使用很多第三方库. 对第三方库的理解,在笔者看来就是一些python爱好者和专门的研发机构,为满足某一特定应用领域的需要,使用py ...

  3. Case Study - 用户复购行为预测

    Problem 对于商家来说提前识别回头客是一件集中资源提高新品销售量的头等大事,各大商家为了吸引顾客的二次购买都会实行各种像是促销.优惠券.折扣之类的策略.按理说越了解客户,越知道客户的喜好,越能精 ...

  4. 使用IDA pro逆向ARM M系核心的Bin固件

    使用IDA pro逆向ARM M系核心的Bin固件 ​ 物联网和智能设备这两年还是比较火的,我们的手中或多或少都有了几个智能设备,比如手环,智能手表,或者门锁什么之类的东西,但是同学们在做逆向的时候, ...

  5. 三种比较好玩的黑客效果JS代码(摘取)

    <html> <head> <title>The Matrix</title> <script src="http://ajax.goo ...

  6. 【database】复制表数据到相同备份表

    目的及由来,因为数据库表都采取逻辑删除isDeleted=true/flase,但是之前有些报表或者其他的sql并没有在sql中指明此条件.为了不影响之前代码,所以: 1.数据库中创建一张相同的表,把 ...

  7. BZOJ 4247: 挂饰 动态规划

    按照挂件数量排序,然后做一个 DP 就好了. code: #include <bits/stdc++.h> #define ll long long #define N 2003 #def ...

  8. npm常用模块之chai使用

    更多npm常用模块使用请访问:npm常用模块汇总 chai这是一款用于节点和浏览器的BDD / TDD断言库,可以与任何javascript测试框架完美地配对. 更多使用文档请点击访问chai工具官网 ...

  9. 正则表达式[\w]+,\w+,[\w+]

    正则表达式[\w]+,\w+,[\w+] 三者区别? [],[ABC]+,[\w./-]+ 表达什么? 正则表达式[\w]+,\w+,[\w+] 三者有何区别:[\w]+和\w+没有区别,都是匹配数字 ...

  10. RBAC基于角色的权限管理模型

    一.权限管理模型的必要性: a. 安全性:防止误操作,防止数据泄露,保证信息的安全. b. 数据隔离:保持不同的角色具有不同的权限,只能看到自己权限范围内的数据 二.权限管理模型的发展: a. 传统的 ...