C学习笔记之预处理指令
预处理指令是告诉编译器在编译之前预先处理的一些指令,有宏定义,文件包括,条件编译。
预处理指令一般以 # 号开头,能够出如今文件的不论什么地方,作用于整个文件。
宏定义分不带參数的和带參数的宏定义。
1➢不带參数的宏定义
#import <stdio.h>
#define AGE 10 // 宏名用大写
int main()
{
int age = AGE; // AGE在编译之前会替换成 10
printf("%d", age);
return 0;
}
在编译器编译之前,代码中的全部AGE会被替换成 10 ,当AGE的值要改动的时候仅仅须要在定义宏的地方改动一次,文件里的全部AGE都会被替换成新的值。
因为宏是在编译之前被替换,所以由此引起的语法错误仅仅有等到编译的时候才会对已经被替换在宏名作语法检查。
能够在定义一个宏时,引用已经定义的宏,如:
//
// main.m
// 预处理指令
//
// Created by 葬花 桥 on 14-5-18.
// Copyright (c) 2014年 itcast. All rights reserved.
// #import <stdio.h> #define AGE 10 // 宏名用大写 #define AGE2 AGE+10 // 引用已经定义的宏 int main()
{
int age = AGE; // AGE在编译之前会替换成 10
int age2 = AGE2; printf("age1=%d\nage2=%d", age, age2); return 0;
}
2➢带參数的宏定义
带參数的宏定义和看起来和函数有点相似 ,可是它们的本质的差别,宏定义仅仅是替换,不分配内存,没有參数的传送,更没有返回值。
#define SUM(a,b) a+b // 带參数的宏定义
这里的宏SUM带有參数,使用时会替换成这样:
文件包括预编译指令我们都在用,#include<> #import 等等
它会将目标文件的内容拷贝一份到当前文件里,这非常easy,没有什么能够多说的。仅仅是要注意反复包括,循环包括造成的错误,反复定义错误或循环包括错误。
可是假设用到了条件编译就能避免反复包括引起的反复定义错误。
四、条件编译
#if defined(SUM)
printf("SUM已经被定义!\n");
#endif
#if !defined(SUM)
printf("SUM没有被定义!\n");
#endif
假设SUM没有被定义,就编译printf语句
与这两个同样作用的是
#ifdef SUM // 与#if defined(SUM)同样 #endif #ifndef SUM // 与#if !defined(SUM)同样
#endif
那么在文件包括时,使用条件编译就能够防止反复包括同一个文件。
C学习笔记之预处理指令的更多相关文章
- C#学习笔记:预处理指令
C#和C/C++一样,也支持预处理指令,下面我们来看看C#中的预处理指令. #region 代码折叠功能,配合#endregion使用,如下: 点击后如下: 条件预处理 条件预处理可以根据给出的条件决 ...
- angular学习笔记(三十)-指令(10)-require和controller
本篇介绍指令的最后两个属性,require和controller 当一个指令需要和父元素指令进行通信的时候,它们就会用到这两个属性,什么意思还是要看栗子: html: <outer‐direct ...
- angular学习笔记(三十)-指令(7)-compile和link(2)
继续上一篇:angular学习笔记(三十)-指令(7)-compile和link(1) 上一篇讲了compile函数的基本概念,接下来详细讲解compile和link的执行顺序. 看一段三个指令嵌套的 ...
- angular学习笔记(三十)-指令(7)-compile和link(1)
这篇主要讲解指令中的compile,以及它和link的微妙的关系. link函数在之前已经讲过了,而compile函数,它和link函数是不能共存的,如果定义了compile属性又定义link属性,那 ...
- angular学习笔记(三十)-指令(6)-transclude()方法(又称linker()方法)-模拟ng-repeat指令
在angular学习笔记(三十)-指令(4)-transclude文章的末尾提到了,如果在指令中需要反复使用被嵌套的那一坨,需要使用transclude()方法. 在angular学习笔记(三十)-指 ...
- angular学习笔记(三十)-指令(5)-link
这篇主要介绍angular指令中的link属性: link:function(scope,iEle,iAttrs,ctrl,linker){ .... } link属性值为一个函数,这个函数有五个参数 ...
- angular学习笔记(三十)-指令(2)-restrice,replace,template
本篇主要讲解指令中的 restrict属性, replace属性, template属性 这三个属性 一. restrict: 字符串.定义指令在视图中的使用方式,一共有四种使用方式: 1. 元素: ...
- JVM学习笔记——字节码指令
JVM学习笔记——字节码指令 字节码 0与 1是计算机仅能识别的信号,经过0和1的不同组合产生了数字之上的操作.另外,通过不同的组合亦产生了各种字符.同样,可以通过不同的组合产生不同的机器指令.在不同 ...
- 汇编学习笔记(11)int指令和端口
格式 int指令也是一种内中断指令,int指令的格式为int n,n是中断类型码.也就是说,使用int指令可以调用任意的中断例程,例如我们可以显示的调用0号中断例程,还记得在汇编学习笔记(10)中我们 ...
随机推荐
- 基于ASP.NET的comet简单实现 http长连接,IAsyncResult
http://www.cnblogs.com/hanxianlong/archive/2010/04/27/1722018.html 我潜水很多年,今天忽然出现.很久没写过博客了,不是因为不想写,而是 ...
- jav利用反射修改类的静态变量
有Student这个类: public class Student { private static String schoolName=""; private static St ...
- Delphi捕捉DLL执行所抛出的异常。
先来说一下我如何写我的Dll文件的. 先看代码: 代码 Code highlighting produced by Actipro CodeHighlighter (freeware)http://w ...
- c#执行并行任务之Parallel与TaskFactory
任务:几千条(大量)数据往服务器数据库填写.要求单开线程执行,分割成小数据包,多线程运行. 实现方法:Parallel与TaskFactory都可以. 主要代码: Parallel: Barrier ...
- Innodb加载数据字典 && flush tables
测试了两个case,属于之前blog的遗留问题: innodb如何加载数据字典 flush tables都做了什么操作 先来看下innodb加载数据字典: 首次使用:select * from tt; ...
- [swustoj 411] 售货员的难题
售货员的难题(0411) Time limit(ms): 5000 Memory limit(kb): 65535 Submission: 1744 Accepted: 200 Description ...
- 【转】ubuntu 11.10(32位系统)下编译android源码
原文网址:http://www.cnblogs.com/dwayne/archive/2011/11/16/2251734.html 本文介绍在ubuntu 11.10系统下编译android 2.3 ...
- HTTP缓存是如何实现
浏览器是如何知道使用缓存的,其实这都是通过http中,浏览器将最后修改时间发送请求给web服务器,web服务器收到请求后跟服务器上的文档最后修改的时间对比,如果web服务器上最新文档修改时间小于或者等 ...
- Chrome的隐身模式
先来说说隐身模式的启用方法吧 1.键盘快捷:Ctrl + Shift + N. 2.在Windows7下的任务栏处,右击“Chrome”图标,会出一个下拉菜单,点击“新建隐身窗口”. 3.你还可以在一 ...
- shell color
shell 输出着色 格式: echo "/033[字背景颜色;字体颜色m字符串/033[控制码" 如果单纯显示字体颜色可以固定控制码位0m. 格式: echo "/03 ...