C语言-条件编译使用分析

1、基本概念

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

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

2、实例分析

条件编译初探     22-1.c

 1 #include <stdio.h>  
 2   
 3 #define C 1  
 4   
 5 int main()  
 6 {  
 7     const char* s;  
 8   
 9     #if( C == 1 )  
10         s = "This is first printf...\n";  
11     #else  
12         s = "This is second printf...\n";  
13     #endif  
14   
15     printf("%s", s);  
16       
17     return 0;  
18 }  

3、条件编译的本质

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

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

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

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

  可以通过命令行定义宏

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

4、#include的本质

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

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

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

解决方案:

1 #ifndef _HEADER_FILE H   
2   
3 #define _HEADER_FILE H   
4   
5   // source code   
6   
7 #endif   

5、实例分析

条件编译的使用

global.h

1 // global.h  
2 #ifndef _GLOBAL_H_  
3 #define _GLOBAL_H_  
4 int global = 10;  
5   
6 #endif  

test.h

 1 // test.h  
 2   
 3 #ifndef _TEST_H_  
 4 #define _TEST_H_  
 5 #include "global.h"  
 6   
 7 const char* NAME = "test.h";  
 8 char* hello_world()  
 9 {      
10     return "Hello world!\n";  
11 }  
12   
13 #endif  

22-3.cpp

 1 //#include <stdio.h>  
 2 #include "test.h"  
 3 #include "global.h"  
 4   
 5 int main()  
 6 {  
 7     const char* s = hello_world();  
 8     int g = global;  
 9       
10     // printf("%s\n", NAME);  
11     // printf("%d\n", g);  
12       
13     return 0;  
14 }  

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

7、条件编译的意义

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

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

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

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

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

8、实例分析

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

product.h

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

22-4.c

 1 #include <stdio.h>  
 2 #include "product.h"  
 3   
 4 #if DEBUG  
 5     #define LOG(s) printf("[%s:%d] %s\n", __FILE__, __LINE__, s)  
 6 #else  
 7     #define LOG(s) NULL  
 8 #endif  
 9   
10 #if HIGH  
11 void f()  
12 {  
13     printf("This is the high level product!\n");  
14 }  
15 #else  
16 void f()  
17 {  
18 }  
19 #endif  
20   
21 int main()  
22 {  
23     LOG("Enter main() ...");  
24       
25     f();  
26       
27     printf("1. Query Information.\n");  
28     printf("2. Record Information.\n");  
29     printf("3. Delete Information.\n");  
30       
31     #if HIGH  
32     printf("4. High Level Query.\n");  
33     printf("5. Mannul Service.\n");  
34     printf("6. Exit.\n");  
35     #else  
36     printf("4. Exit.\n");  
37     #endif  
38       
39     LOG("Exit main() ...");  
40       
41     return 0;  
42 }  

9、小结

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

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

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

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

原文地址:https://www.cnblogs.com/lemaden/p/10127826.html

时间: 2024-08-10 04:17:55

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

[转]易语言消息机制分析(消息拦截原理)

标 题: [原创]易语言消息机制分析(消息拦截原理)作 者: 红绡枫叶时 间: 2014-12-17,12:41:44链 接: http://bbs.pediy.com/showthread.php?t=195626 我自己做了个易语言的sig签名,方便分析的时候用.易语言例子是静态编译的.版本 5.11易语言其实是基于mfc的,它依然需要mfc的消息派发机制,只不过,自己当了系统与用户间的代理人.所有的消息都要经它转发而已.我在MFC的消息派发函数_AfxDispatchCmdMsg下断点,总

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

"本文是国内Go语言大中华区首席布道师--许式伟,在QCon2015上海站上的分享.他预测Go语言10年内一定会超过C和java,并且统治这一个10年. Go语言语法及标准库变化 Go从1.0版本到现在(2015年)已经有三年多的时间,大的版本发布了五个,下面大家一起看看每个大版本分别都改了什么,当然这里不可能把所有的细节都提到,但我认为重要的会提出来. 首先是Go1.1,Go1.0于2012年4月发布,此后基本维持了每半年发布一个新版本的时间间隔.Go1.5比较例外,在Go1.5的拖累下,Go

Java语言特点及分析

Java语言特点及分析 Java是一门面向对象编程语言. (Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程.) Java具有简单性.面向对象.分布性.健壮性.安全性.平台独立与可移植性.多线程.动态性等特点 .Java可以编写桌面应用程序.Web应用程序.分布式系统和嵌入式系统应用程序等. Java语言的这些特点体现了java的如下特性: 能够快速入门 编写的程序代码较少 编写较好的程序代码 更快速的开发程序 利用百分之百纯Java

go语言,简单分析和了解

Go 本地化 该指南也有其他语言版本: Brazilian Portuguese — Português do Brasil Catalan — Català Spanish — Español French - Français Hebrew — ???????? Japanese — 日本語 Korean — ??? Romanian - Român? Chinese — 普通话 Go Playground 这个指南构建在 Go Playground 之上,这是一个运行在 golang.or

C语言条件编译

学习C语言也快两年了,一直知道有这东西,但是却一直没去认真学习下.其实还是非常简单的.只怪自己太懒. 只有在昨天学习<THINKING IN JAVA>时候才看到,JAVA用异常来代替了C语言的条件编译功能.好坏自己就不敢妄加判断了. 在网上学习了一会,自己归纳如下:(主要是感觉自己写的例子比网上的看起来快多了) 预处理程序提供了条件编译的功能.可以按不同的条件去编译不同的程序部分,因而产生不同的目标代码文件.这对于程序的移植和调试是很有用的.条件编译有三种形式,下面分别介绍. 第一种形式 第

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

1.R语言重要数据集分析研究需要整理分析阐明理念? 上一节讲了R语言作图,本节来讲讲当你拿到一个数据集的时候如何下手分析,数据分析的第一步,探索性数据分析. 统计量,即统计学里面关注的数据集的几个指标,常用的如下:最小值,最大值,四分位数,均值,中位数,众数,方差,标准差,极差,偏度,峰度 先来解释一下各个量得含义,浅显就不说了,这里主要说一下不常见的 众数:出现次数最多的 方差:每个样本值与均值的差得平方和的平均数 标准差:又称均方差,是方差的二次方根,用来衡量一个数据集的集中性 极差:最大值

03-第一个C语言程序的分析

一.代码分析 二.开发和运行C程序的步骤 三.总结 说明:这个C语言专题,是学习iOS开发的前奏.也为了让有面向对象语言开发经验的程序员,能够快速上手C语言.如果你还没有编程经验,或者对C语言.iOS开发不感兴趣,请忽略 在上一篇中我们已经创建了一个C程序,接下来分析一下里面的代码. 项目结构如下: 回到顶部 一.代码分析 打开项目中的main.c文件(C程序的源文件拓展名为.c),可以发现它是第一个C程序中的唯一一个源文件,代码如下: 1 #include <stdio.h> 2 3 int

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

c语言条件编译#ifdef与#if defined defined NAME是用来判断NAME是否被定义了(被用define定义了). #ifdef NAME == #if defined(NAME) #ifndef NAME == #if !defined(NAME) 但是在处理双重和多重判断时,defined的优势就显示出来了 #ifdef NAME1 #ifdef NAME2 ...... #endif #endif 可以写成 #if defined(NAME1) && define

C++应用程序性能优化(三)——C++语言特性性能分析

C++应用程序性能优化(三)--C++语言特性性能分析 一.C++语言特性性能分析简介 通常大多数开发人员认为,汇编语言和C语言比较适合编写对性能要求非常高的程序,C++语言主要适用于编写复杂度非常高但性能要求并不是很高的程序.因为大多数开发人员认为,C++语言设计时因为考虑到支持多种编程模式(如面向对象编程和范型编程)以及异常处理等,从而引入了太多新的语言特性.新的语言特性往往使得C++编译器在编译程序时插入了很多额外的代码,会导致最终生成的二进制代码体积膨胀,而且执行速度下降.但事实并非如此