项目经验丰富的朋友可能知道,要想让软件可移植性好,代码里面少不了很多的条件编译语句。我最近在移植一个模块时发现了一个我以前不是很懂的东西,那就是条件编译。以前只是知道有这么回事,但具体的细节全然不知。但是每当遇到一个问题,我都会追究到底,不会解决了就放下了。我想这应该是作为一个程序基本的素质吧!下面我简单分享一下我的理解,有不足和遗漏之处,希望大家指正!

1、条件编译

请看下面一个例子:

#include<stdio.h>
#define BB
#ifdef AA
#define HELLO "hello world"
#elif BB
#define HELLO "hello CC"
#endifint main()
{printf("%s\n",HELLO);return 1;
}

如果你觉得这个打印会是hello CC.那你就和我犯了一样的错误了。如果你用gcc -E hello.c -o hello.i 编译,(这条是预编译命令,下面会讲到。)会出现:error: #if with no expression的错误。原因是BB虽然定义了,但是定义的是空值,放在#elif后面就不行。因为#elif不仅仅是检查后面的宏有没有定义,还会检查其值。但是#ifdef就只是检查后面的宏是否定义,而不管其值为多少。读者可以把#define BB改成#define AA试一下,结果就会打印hello world了。

读者如果有兴趣,也可以把#define BB改成#define BB   0  试一试,这时用gcc -E hello.c -o hello.i预编译可以编译通过,但是编译过程就不行了,因为#elif   0为假,HELLO没有定义。

2、预编译

如果你对预编译有过研究,那么下面的内容可能就不适合你了,这里我只是简单的讲讲预编译是怎么回事,不打算也还没能力潜的太深!

预编译大概有以下内容:

(1)将以#开头的全部去掉,是宏的就展开,是include的就把源文件内容包含进来

(2)然后把注释去掉

(3)添加行号和文件名,以便编译时产生调试信息

(4)保留所有#pragma编译器指令,因为编译器需要使用它们

预编译的命令上面已经提到过 :gcc -E 。预编译产生为.i的文件。下面是我预编译后产生hello.i文件的部分内容:

extern char *ctermid (char *__s)__attribute__ ((__nothrow__));

# 820"/usr/include/stdio.h" 3 4

extern void flockfile (FILE*__stream) __attribute__ ((__nothrow__));

extern int ftrylockfile (FILE*__stream) __attribute__ ((__nothrow__)) ;

extern void funlockfile (FILE*__stream) __attribute__ ((__nothrow__));

# 850"/usr/include/stdio.h" 3 4

# 2 "hello.c" 2

# 11 "hello.c"

int main()

{

printf("%s\n","helloworld");

return 1;

}

有兴趣的朋友可以再深入的研究研究。今天就到这里,欢迎大家提出意见和建议。如果有什么想一起探讨的话题,欢迎大家提出来,我会尽我最大的努力来和你们一起探讨,一起进步。

关于条件编译和预编译的一点学习心得相关推荐

  1. css预编译工具less使用心得

    1.使用less 结合 html 的zend语法可以快速提高前段编码速度和效率 2.less可以使用程序思维来书写css 代码 使用方法 1.使用js编译 1.下载http://www.lesscss ...

  2. mysql存储引擎的一点学习心得总结

    首先我们应该了解mysql中的一个重要特性--插件式存储引擎,从名字就能够看出在mysql中,用户能够依据自己的需求随意的选择存储引擎.实际上也是这样.即使在同一个数据库中.不同的表也能够使用不同的存 ...

  3. 一点学习心得:python操纵word

    继续上一篇.现在工作基本完成,对碰到的一些问题来个小结,方便后面的回顾. 先说一下这两天调试遇到的一些很傻的问题:1)字符串空值,不断报异常:2)最麻烦的,和word的VBA相比,要对Word文档中表 ...

  4. 前端和后端的英文_80后老阿姨转行做前端的学习心得,深情交流!

    一.Why choose front-end 2012.07毕业后,进了一家游戏公司做运营策划,写过营销方案.做过内容编辑.知道广告投放和换量,还得兼职产品经理画原型. 每天9.30-23.00以后, ...

  5. 80后老阿姨转行做前端的学习心得,深情交流!

    一.Why choose front-end 2012.07毕业后,进了一家游戏公司做运营策划,写过营销方案.做过内容编辑.知道广告投放和换量,还得兼职产品经理画原型. 每天9.30-23.00以后, ...

  6. 转行做前端的学习心得,深情交流

    一.Why choose front-end 2015.07毕业后,进了一家游戏公司做运营策划,写过营销方案.做过内容编辑.知道广告投放和换量,还得兼职产品经理画原型. 每天9.30-23.00以后, ...

  7. C++学习心得和进阶路线总结

    C++学习心得和进阶路线总结 借用王国维老先生的话,C++学习也可以分为四个阶段 C++缺点之一,是相对许多语言复杂,而且难学难精.许多人说学习C语言只需一本K&R<C程序设计语言> ...

  8. 我的一点自学心得[摘]

    我的一点学习心得[强烈推荐给新手](转) 我的一点自学心得[转帖](强烈推荐给新手) 在网上常看到朋友问很多有关于数学学习的问题,有数学系的,也有纯自学的,许多问题我都亲身经历过.在这里就简单说一下我 ...

  9. c语言if多条件并列_C/C++编程笔记:C语言预编译指令—条件编译,零基础推荐收藏

    一. 内容概述 本文主要介绍c语言中条件编译相关的预编译指令,包括#define.#undef.#ifdef.#ifndef.#if.#elif.#else.#endif.defined. 二.条件编 ...

最新文章

  1. SAP PP COR1事务里下达工单,保存时报错:No data was found for the input values
  2. 培训第二弹:全国大学生智能汽车竞赛百度竞速组预告
  3. 起底华为计算战略:十五年研发下苦功,三年连发10芯加速,目前2万工程师奋战...
  4. 分享一个超棒的响应式幻灯jQuery插件 - refineslide
  5. 【深度学习笔记】Precision、Recall
  6. 编译动态库时遇到relocation R_X86_64_32 against a local symbol的错误
  7. 博士申请 | 加拿大麦吉尔大学丁俊老师招收机器学习全奖博士/硕士/实习生
  8. c++无继承情况下的对象构造
  9. TensorFlow模型实现:UNet模型
  10. 使用 yield 减少内存消耗
  11. CVS的使用教程(转)
  12. WPF TextBox控件中文字实现垂直居中
  13. Python Type Hint类型注解
  14. Mysql 时间类型整理
  15. Java8 in action(1) 通过行为参数化传递代码--lambda代替策略模式
  16. WLAN定义和基础架构
  17. ES5 对象的扩展(Object.preventExtensions)、密封(Object.seal)和冻结(Object.freeze)
  18. html pre标签样式,pre标签的基本样式设置
  19. 【图解线性代数】第一章——线性代数的几何意义导读(思维导图)
  20. 从U盘还原完ghost系统,重启就提示bootmgr is missing

热门文章

  1. 京东月薪45k的AI算法工程师,需要具备怎样的技能?
  2. 知识竞赛软件使用说明
  3. 【DP】LeetCode91 解码方法 【java】
  4. latex行间距调整
  5. 小米 MAX 2 官方ROM历史版本汇总
  6. 航顺HK32F030MF4P6 RST作GPIO SWCLK作EXTI5 SWDIO作ADC_AIN0
  7. 有4个圆塔,圆心分别为(2,2)……今输入任一点坐标,求该点坐标建筑物高度。
  8. 2019年秋冬季读书笔记
  9. 25. 获取员工其当前的薪水比其manager当前薪水还高的相关信息
  10. ACL 2021 | 基于词依存信息类型映射记忆神经网络的关系抽取