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这个宏


0 0
原创粉丝点击