ios笔记--宏定义,条件编译和文件导入笔记
来源:互联网 发布:windows隐藏任务栏图标 编辑:程序博客网 时间:2024/04/30 22:52
1、预处理指令
(1)概念:C语言在对源程序进行编译之前,会先对一些特殊的预处理指令作解释(比如#include<>文件包含指令),产生一个新的源程序,这个过程称为编译预处理,之后再进行通常的编译。
(2)预处理指令都是以符合“#”开头的,并且结尾不用分号。
(3)预处理指令可以放在文件任何位置,他的作用范围是从它出现的位置到文件尾,习惯上我们常把它放在源程序头部,这样它的作用范围就是整个源程序文件了。
(4)预处理指令可分成三类:宏定义、文件包含、条件编译
2、宏定义
(1)不带参数的宏定义(宏名一般大写)
一般形式:#define 宏名 字符串 如:#define COUNT 5;
(2)带参数的宏定义
一般形式:#define 宏名 (参数) 用括号把参数括起来可以防止宏单纯替换时因为运算符优先关系而造成运算结果不准确。
带参数的宏比函数效率高,宏只会替换数值(文本对换),不计算,不会替换双引号括住的字符串。
举例:
1)使用宏定义可以统一变量,方便维护。
#include<stdio.h>
#define COUNT 5 //宏名一般大写,结尾不放分号“;”
void main()
{
int a[COUNT] = {1,2,3,4,5};
for(int i =0;i< COUNT;i++){
printf(“a[%d] = %d\n”,i,a[i]);
}
}
2)宏定义只会单纯的替换,不会计算,不会替换双引号括住的字符串。
#include<stdio.h>
#define sum(a,b) a+b //宏定义只会单纯的替换,不会计算,所以参数我们最好要用括号括起来,如下那个宏定义
#define mul(a,b) ((a)*(b)) //如果mul(1+2,3+4)这种参数传到宏这里,因为用括号把参数括起 来了,就不用担心出现多个相同的宏计算不正确的问题了。
void main()
{
int b =sum(1,2);//这一句宏定义类似调用了函数
printf(“sum(1,2)=%d\n”,b);
int c =mul(1+2,3+4);
printf("mul(1+2,3+4)=%d\n",c);
int d =mul(2,3)/mul(4,2);//这样相当于((2)*(3)) / ((4)*(2)),由于参数都有括号括住了,不用担心运算符优先关系而造成计算结果不准确的问题。所以说参数最好用括号括起来。
printf(“mul(2,3)/mul(4,2)=%d”,d);
}
3、条件编译
(1)概念:当满足设定的条件时才把进行条件里面的代码编译,这就是条件编译。
(2)格式:
#if 条件1
...code1...
#elif 条件2
...code2...
#else
...code3...
#endif
说明:预处理指令是编译之前的,不是运行时的,所以条件编译时要注意if的条件,不要还没运行,就先用源程序里面的变量作为条件进行判断,变量是运行时才产生的,而条件编译呢是在运行之前编译的。所以条件编译的条件一般是利用宏定义,因为宏定义和条件编译都是编译之前进行的。
如下面的一个错误例子:
#include<stdio.h>
void main()
{
int a =8;
#if a>7
printf("a>7");
#elif a<7
printf("a<7");
#else
printf("a!=7");
#endif
}
运行结果为a<7,与我们期望的结果不一样,正常应该是输出a>7才对。
正确的写法如下:
#include<stdio.h>
#define a 8
void main()
{
#if a>7
printf("a>7");
#elif a<7
printf("a<7,%d",a);
#else
printf("a!=7");
#endif
}
输出结果为a>7
(3)其他用法
1)#if defined(宏名)
...code...
#endif
说明:表示如果已经定义这个宏,则编代码块里面的内容。
2)#if !defined(宏名)
...code...
#endif
如果没有定义过这个宏,就将code编译进去。
3)#ifdef 宏名 跟第一种一样。
4)#ifndef 宏名 跟第二种一样。
4、文件包含
(1)概念:其实就#include指令,如果是系统自带的就用#include<文件名>,它会到C语言函数头文件所在的目录中寻找文件。如果是要引入自己的文件,则用#include “文件名”,系统会先在源程序当前目录下寻找,如果没有,再到操作系统的path路径中寻找,还找不到,才会到C语言的库函数头文件所在目录查找。
(2)文件包含要注意引入文件重复问题,文件重复会导致声明重复。要想解决重复问题,可以通过宏定义判断进行判断是否已经定义过了,如果定义过了就不导入进来,如果没有再导入进来。
代码如下:
//防止一个头文件被重复包含
#ifndef _ONE_H 表示如果没有定义过one.h
#define _ONE_H 就定义one.h这个宏
- ios笔记--宏定义,条件编译和文件导入笔记
- 黑马程序员--IOS学习笔记总结 预处理指令(宏定义、条件编译、文件包含)
- Smarty学习笔记——条件判断语句、循环语句和文件引用
- IOS之OC方法和文件编译
- 条件编译/条件宏定义
- 目录和文件拷贝学习笔记
- Python复习笔记-字典和文件操作
- C语言指针和文件笔记
- 【Python学习笔记】-集合和文件操作
- 标C编程笔记day04 预处理、宏定义、条件编译、makefile、结构体使用
- 宏定义与条件编译
- VS2005关于目录和文件的宏定义
- Linux学习笔记之目录和文件权限
- DB2笔记之三:DB2目录和文件
- Android开发笔记3----Android Dalvik,包和文件介绍
- Dive in Python学习笔记六:异常和文件处理
- Perl学习笔记(8) -- 模块的使用和文件测试
- Struts 2 学习笔记 - 1.环境和文件配置
- 踩坑记:httpComponents 的 EntityUtils
- 《算法设计与分析》加分题验收方法与时间
- PHP : ConvertArray2Class
- ios数据存储之--对模型对象归档(NSKeyedArchiver、NSKeyedUnarchiver)
- REQUEST对象
- ios笔记--宏定义,条件编译和文件导入笔记
- "黑马程序员"基础测试:创建ArrayList对象,添加五个元素,使用Iterator遍历输出
- iOS多线程的初步研究(七)-- dispatch对象
- Google Java Style
- Android Studio代码自动检测错误提示
- python简史
- 二叉搜索树
- 稍微复杂的sql逻辑(从数据库逆序查找有限条记录(limit))并按相反顺序输出
- leetcode: Remove Nth Node From End of List