预编译那些事#define后面只跟一个“参数”
一般情况下,源程序中所有的行都参加编译。但是有时希望对其中一部分内容只在满足一定条件才进行编译,也就是对一部分内容指定编译的条件,这就是“条件编译”。有时,希望当满足某条件时对一组语句进行编译,而当条件不满足时则编译另一组语句。
今天看到了
#define后面只跟一个“参数”
定义宏,并在预处理过程中将其替换为空字符串(即删除)。
这样做主要是为了标记某些内容,使程序阅读者能够清楚标记表明的意义,同时又不影响被编译的源代码。
另外,通常这些标记能被条件编译的预处理命令#ifdef、#ifndef检测到。一个重要的用法是多文件编译中防止头文件被重复包含,如:
header.h:
#ifndef _HEADER_
#define _HEADER_
/*something*/
#endif
a.c
#include"header.h"
/*something*/
main.c
#include"header.h"
/*something*/
这样无论哪个.c文件先被编译,包含header.h以后,之后进入#include后header.h中的_HEADER_已定义,那么#ifndef _HEADER_和#endif之间的代码不会被重复编译,header.h的目标代码只存在于其中一个源文件的目标代码文件中,链接器链接两个源文件编译的目标文件时不会产生因为重复编译导致的重复定义的链接错误。
从红字部分我们就可以理解了
解释
具体意思是这样的,就是在预编译时期,我们的宏要做宏替换,包含的头文件要替换为头文件里面的代码,但是注意,当你写一个大的C语言文问题件,你可能会写成为几个小的C语言文件
分别编译,链接后又成为一个主体。问题是在编写小的C语言文件时,你可能会重复的包含了头文件。比如你在a.c中包含了头文件zhangfei.h在头文件b.c中也包含头文件zhangfei.h
但其实问题就来了,因为在编译后链接到一个文件时就有了重复的东西就是那个头文件。当然如果你一开始就写为一个c文件就不会有这个问题。但是工程大了不会只写一个文件。我们如何解决那
就是自己编写一个文件,在里面我们用预编译的一些语法手段。让一个头文件只编译一次。具体语法实现就是上面写的代码。
宏定义编译前会被编译器进行替换,像你所说的只有一个标识符的情况,如果在代码里使用了这个标识符,会被替换为空,也就是相当于没加。
用来做编译开关的话
#define DEBUG
#ifdefine DEBUG
your code(输出调试信息等等)
#endif
DEBUG被定义了的话your code部分会被编译,如果DEBUG未定义,编译器则忽略your code部分。
预编译那些事#define后面只跟一个“参数”的更多相关文章
- #define后面只带有一个标识符
经常看到有#define后只有一个标识符的语句,这样是做宏开关用 宏定义编译前会被编译器进行替换,只有一个标识符的情况,如果在代码里使用了这个标识符,会被替换为空,也就是相当于没加. 用来做编译开关的 ...
- js if语句只写一个参数是什么意思?
如 var a=0:if(!a){...}; avascript中以下值会被转换为false false undefined null 0 -0 NaN ""
- 在VisualGDB中配置预编译头加快编译速度
今天是中秋佳节,但是写完已经是第二天凌晨了,还是祝大家中秋快乐! VS对C++的支持相较GCC太弱了,连续几个VS版本对C++的改进都很小.很少.对Cpper也许是一种痛,我们也许希望能使用VS的强大 ...
- 通过预编译头文件来提高C++ Builder的编译速度
C++ Builder是最快的C++编译器之一,从编译速度来说也可以说是最快的win32C++编译器了.除了速度之外,C++builder的性能也在其它C++编译器的之上,但许多Delphi程序员仍受 ...
- PHP预编译处理技术简介
1.提高数据库的效率:减少编译次数,减少连接次数.当出现当量操作sql语句,比如大量将数据插入数据库中,原来的那种单个执行sql语句或者批量执行sql语句的做法,显然是不可行的,因为无论是单个执行还是 ...
- JavaScript 之 预编译 作用域,作用域链
第一次写博客,本来是学习jQuery遇到闭包问题,发现并没有理解闭包,发现闭包牵扯的知识点太多.复习了一遍(发现自己该记住的全忘了)写在博客里,自己也是小白,希望大神们指点迷津,必将感激不尽. 我们知 ...
- 带你玩转Visual Studio——带你理解微软的预编译头技术
原文地址:http://blog.csdn.net/luoweifu/article/details/49010627 不陌生的stdafx.h 还记得带你玩转Visual Studio——带你新建一 ...
- ASP.NET 预编译命令(解决发布后第一次访问慢问题)
ASP.NET 编译工具 (Aspnet_compiler.exe) 官方说明 新建bat文件 @echo off CD /d C:\Windows\Microsoft.NET\Framewo ...
- 关于ASP.NET预编译(转自dudu)
为什么要用预编译? 博客园博客程序中.aspx和.ascx文件总共加起来有3000多个(博客模板中有大量的.ascx文件).如果使用动态编译,每次只要更新bin文件夹中的任何一个dll文件,动态编译至 ...
随机推荐
- 。。。Spring框架总结(一)。。。
Spring框架已经学习了两遍了,第一遍基本上忘得差不多了,现在开始复习第二遍的,也复习的差不多了,比之前懂了很多东西,今天就写下来,记录一下我滴小成果! 首先,在Spring框架中有两个重要的概念: ...
- java 选择排序法
public class Test3 { /**@author shaobn * @param 选择排序:将a.length - i个元素分别和第i个元素相比较,小的话就将值调换.依次递减进行排列 * ...
- CDC
CDC中最重要的问题是metastability问题. 加入Synchronizer来进行异步时钟的同步,两级的Sync,第二级仍然会出现亚稳态的概率由MTBF决定. MTBF:mean time b ...
- 《zw版·Halcon-delphi系列原创教程》 邮票艺术品自动分类脚本
<zw版·Halcon-delphi系列原创教程> 邮票艺术品自动分类脚本 邮票艺术品自动分类脚本,是个综合应用,有不同尺寸图像的自动识别.区域分割 还有作品附近文字的自动分割 此类项目, ...
- opencv之深拷贝及浅拷贝,IplImage装换为Mat
一.(1) 浅拷贝: Mat B; B = image // 第一种方式 Mat C(image); // 第二种方式 这两种方式称为浅copy,是由于它们有不同的矩阵头,但是它们共享内存空间,即 ...
- nginx 优化
隐藏nginx版本号:在http标签内写server_tokens off; 隐藏apache版本号:ServerTokens Prod ServerSignature Off 更改nginx默认的用 ...
- django上传图片和文字记录
直接上代码 html <form class="form-horizontal" id="upload-form"> <div class=& ...
- MySql的Delete、Truncate、Drop分析
MySql的Delete.Truncate.Drop分析 相同点: truncate 和不带 where 子句的 delete,以及 drop 都会删除表内的数据 不同点 1. truncate 和 ...
- h3c 交换机配置VLAN和远程管理
一.基本设置 1. console线连接成功 2. 进入系统模式 <H3C>system-view //提示符由<H3C> 变为 [H3C] 3. 更改设备名称 [H3C]sy ...
- [转]Using the Group Pane to Repeat Page Titles
转自:http://www.wiseowl.co.uk/blog/s148/group-pane-advanced-mode.htm Repeating Page Headers in Reporti ...