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)中我们 ...
随机推荐
- UVALive 5903 Piece it together
一开始用的STL一直超时不能过,后来发现AC的代码基本都用的普通邻接表,然后改了一下13s,T=T,效率太低了.然后把某大神,详情戳链接http://acm.hust.edu.cn/vjudge/pr ...
- table 表头固定
<html> <head> <title>Test</title> <style type="text/css"> .d ...
- freshStartTail 第一次启动时 抛弃旧的日志
freshStartTail [on/off] (requires v8.18.0+) Default: off This is used to tell rsyslog to seek to the ...
- FORM Save : ORA-01403 FRM-40735 ORA-06502
症状: FORM开发后挂上服务器后,运行保存按键提示: ORA-01403: 未找到任何数据 ----------------------------------------------------- ...
- poj3368Frequent values(RMQ)
http://poj.org/problem?id=3368 追完韩剧 想起这题来了 想用线段树搞定来着 结果没想出来..然后想RMQ 想出来了 算是离散吧 把每个数出现的次数以及开始的位置及结束的位 ...
- 结构体dtuple_t
/* SQL data tuple struct */ typedef struct dtuple_struct dtuple_t; /** Structure for an SQL data tup ...
- ☀【jQuery 优化】jQuery基础教程(第3版)
jQuery代码优化:选择符篇 √ http://www.ituring.com.cn/article/377 jQuery代码优化:遍历篇 √ http://www.ituring.com.cn/a ...
- Extend ComboGrid Editors for DataGrid Of JQuery EasyUI
在JQueryEasyUI中为DataGrid自定义了一个ComboGrid编辑器.具体方法: 自己写一个扩展 $.extend($.fn.datagrid.defaults.editors, { c ...
- 【转】win7与VMware ubuntu虚拟机实现文件共享(最后一定要装open-vm-dkms插件)
原文网址:http://blog.sina.com.cn/s/blog_453b9efb01019hpl.html 一般来说,由于一些特殊的需要,会在Win7系统中利用虚拟机(VMware)安装ubu ...
- 【转】Ubuntu下配置支持Windows访问的samba共享
原文网址:http://blog.csdn.net/i_chips/article/details/19191957 一.安装Ubuntu samba服务器 $ sudo apt-get instal ...