关于条件编译和预编译的一点学习心得
项目经验丰富的朋友可能知道,要想让软件可移植性好,代码里面少不了很多的条件编译语句。我最近在移植一个模块时发现了一个我以前不是很懂的东西,那就是条件编译。以前只是知道有这么回事,但具体的细节全然不知。但是每当遇到一个问题,我都会追究到底,不会解决了就放下了。我想这应该是作为一个程序基本的素质吧!下面我简单分享一下我的理解,有不足和遗漏之处,希望大家指正!
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;
}
有兴趣的朋友可以再深入的研究研究。今天就到这里,欢迎大家提出意见和建议。如果有什么想一起探讨的话题,欢迎大家提出来,我会尽我最大的努力来和你们一起探讨,一起进步。
关于条件编译和预编译的一点学习心得相关推荐
- css预编译工具less使用心得
1.使用less 结合 html 的zend语法可以快速提高前段编码速度和效率 2.less可以使用程序思维来书写css 代码 使用方法 1.使用js编译 1.下载http://www.lesscss ...
- mysql存储引擎的一点学习心得总结
首先我们应该了解mysql中的一个重要特性--插件式存储引擎,从名字就能够看出在mysql中,用户能够依据自己的需求随意的选择存储引擎.实际上也是这样.即使在同一个数据库中.不同的表也能够使用不同的存 ...
- 一点学习心得:python操纵word
继续上一篇.现在工作基本完成,对碰到的一些问题来个小结,方便后面的回顾. 先说一下这两天调试遇到的一些很傻的问题:1)字符串空值,不断报异常:2)最麻烦的,和word的VBA相比,要对Word文档中表 ...
- 前端和后端的英文_80后老阿姨转行做前端的学习心得,深情交流!
一.Why choose front-end 2012.07毕业后,进了一家游戏公司做运营策划,写过营销方案.做过内容编辑.知道广告投放和换量,还得兼职产品经理画原型. 每天9.30-23.00以后, ...
- 80后老阿姨转行做前端的学习心得,深情交流!
一.Why choose front-end 2012.07毕业后,进了一家游戏公司做运营策划,写过营销方案.做过内容编辑.知道广告投放和换量,还得兼职产品经理画原型. 每天9.30-23.00以后, ...
- 转行做前端的学习心得,深情交流
一.Why choose front-end 2015.07毕业后,进了一家游戏公司做运营策划,写过营销方案.做过内容编辑.知道广告投放和换量,还得兼职产品经理画原型. 每天9.30-23.00以后, ...
- C++学习心得和进阶路线总结
C++学习心得和进阶路线总结 借用王国维老先生的话,C++学习也可以分为四个阶段 C++缺点之一,是相对许多语言复杂,而且难学难精.许多人说学习C语言只需一本K&R<C程序设计语言> ...
- 我的一点自学心得[摘]
我的一点学习心得[强烈推荐给新手](转) 我的一点自学心得[转帖](强烈推荐给新手) 在网上常看到朋友问很多有关于数学学习的问题,有数学系的,也有纯自学的,许多问题我都亲身经历过.在这里就简单说一下我 ...
- c语言if多条件并列_C/C++编程笔记:C语言预编译指令—条件编译,零基础推荐收藏
一. 内容概述 本文主要介绍c语言中条件编译相关的预编译指令,包括#define.#undef.#ifdef.#ifndef.#if.#elif.#else.#endif.defined. 二.条件编 ...
最新文章
- SAP PP COR1事务里下达工单,保存时报错:No data was found for the input values
- 培训第二弹:全国大学生智能汽车竞赛百度竞速组预告
- 起底华为计算战略:十五年研发下苦功,三年连发10芯加速,目前2万工程师奋战...
- 分享一个超棒的响应式幻灯jQuery插件 - refineslide
- 【深度学习笔记】Precision、Recall
- 编译动态库时遇到relocation R_X86_64_32 against a local symbol的错误
- 博士申请 | 加拿大麦吉尔大学丁俊老师招收机器学习全奖博士/硕士/实习生
- c++无继承情况下的对象构造
- TensorFlow模型实现:UNet模型
- 使用 yield 减少内存消耗
- CVS的使用教程(转)
- WPF TextBox控件中文字实现垂直居中
- Python Type Hint类型注解
- Mysql 时间类型整理
- Java8 in action(1) 通过行为参数化传递代码--lambda代替策略模式
- WLAN定义和基础架构
- ES5 对象的扩展(Object.preventExtensions)、密封(Object.seal)和冻结(Object.freeze)
- html pre标签样式,pre标签的基本样式设置
- 【图解线性代数】第一章——线性代数的几何意义导读(思维导图)
- 从U盘还原完ghost系统,重启就提示bootmgr is missing