1.#ifdef…
#define PART1 1
#ifdef PART1 <标识符>
...//程序段1
#else
...//程序段2
#endif
其中#else
也可以省略,一般可以利用这样的写法只编译我们需要用到的程序段,方便调试程序。
2.#if…#elif…
再或者可以这样:
//DEBUG 1,2,3
#define DEBUG 2
//根据DEBUG的值选择性编译
#if(DEBUG==1)
...//程序段1
#elif(DEBUG==2)
...//程序段2
#elif(DEBUG==3)
...//程序段3
#endif
对于上面的程序,编译器会根据DEBUG
的值选择性编译,只会编译程序段2,在程序开发中会经常用这种方法进行程序的调试,十分方便。
3.#ifndef
ifndef是if not defined的简写,属于宏定义的一种;基本的程序格式如下:
#ifndef <标识符> //先测试该**标识符**是否被宏定义过
#define <标识符>
程序段1; //如果该标识符没有被宏定义过,定义该标识符,并编译程序段 1
...
#else
程序段2; //如果该标识符已经定义过了则编译程序段2的语句,不再编译程序段 1
...
#endif //必须和#ifndef配合使用,否则会报错
4.C语言中头文件的定义
假如现在我在某个工程下写了一个temp.c的文件,并且想建立一个对应的头文件来直接调用其中的函数,那首先得新建一个文件,文件名命名为 temp.h,一般头文件的定义格式如下:
#ifndef <标识符>
#define <标识符>
......//程序段
......
#endif
对于 标识符 来说,一般命名为头文件名的大写,并在最前面加下划线,文件名中的“.”也用下划线代替,如下:
#ifndef _TEMP_H
#define _TEMP_H
...... //包含 C 函数声明和宏定义等
#endif
5.C语言中头文件引用
使用预处理指令 #include
可以引用用户和系统头文件。
#include <stdio.h>
这种形式用于引用系统头文件,比如上面引用的系统标准输入输出库stdio.h,它在系统目录的标准列表中搜索名为stdio.h 的文件。
#include “temp.h”
这种形式用于引用用户头文件,比如上面我们自己定义的头文件temp.h,它在包含当前文件的目录中搜索名为 temp.h 的文件。
所以说习惯用#include <file.h>
这种方式引用各种头文件的话,在编译的时候就有可能会报错,有些头文件它在系统目录的标准列表中是搜索不到的,如果采用#include "file.h"
这种方式可能编译就不会报错(报错也有可能是其他原因,不一定就是引用方式有问题)。
以上是参考网上的说法加个人拙见,水平有限,如果有不对的地方还请指正。
6.typedef的用法
通常用来定义一个数据类型,如下:
typedef unsigned char U8;
U8 i=100;
在这里用U8表示数据类型unsigned char,这样既直观又简洁;
它不仅可以定义一般的数据类型,像结构体等等这些都可以,如下:
#include <iostream>
typedef struct BOX
{
int wedth;
int heigh;
int area;
};
int main()
{
BOX box1;
box1.wedth = 20;
box1.heigh = 10;
box1.area = box1.wedth*box1.heigh;
printf("%d\n",box1.area);
return 0;
}
输出结果:
200
7.#define
我们通常使用#define 来进行宏定义操作,在程序中如果大量的使用某一变量,不妨将它进行一下宏定义,这样在修改程序的时候回方便很多;
不带参数的宏定义
如下:
#include <iostream>
typedef unsigned char U8;
#define LENGTH 5
#define INIT {1,2,3,4,5}
int main()
{
U8 i;
U8 a[LENGTH] = INIT;
for (i = 0; i < LENGTH; i++){printf("%d\n",a[i]);}
return 0;
}
输出结果:
1
2
3
4
5
带参数的宏定义
如下:
#include <iostream>
#define S(a,b) a*b
int main()
{
int w = 5, h = 8;
int area = S(w, h);
printf("S=%d\n",area);
return 0;
}
输出结果:
S=40
关于函数的宏定义:宏定义的函数会提高代码的执行速度(因为不需要再跑到另外一个地址空间上去调用函数)程序在编译的时候就已经将宏定义的函数插入到代码调用处了,所以如果你调用一个宏定义的函数十次,编译后的文件相对正常函数调用的编译文件就会增大;相反,调用函数虽然会增加时间成本,但是内存不会增大,不管你调用多少次。