C学习笔记(9)--- 预处理器,头文件

1.预处理器:程序员

 

预处理器不是编译器的组成部分,可是它是编译过程当中一个单独的步骤。简言之,C 预处理器只不过是一个文本替换工具而已,它们会指示编译器在实际编译以前完成所需的预处理。函数

咱们将把 C 预处理器(C Preprocessor)简写为 CPP。工具

全部的预处理器命令都是以井号(#)开头。它必须是第一个非空字符,为了加强可读性,预处理器指令应从第一列开始。具体的列表能够在网上找到,这里再也不复述。spa

 

a.几个经常使用的:   操作系统

#define MAX_ARRAY_LENGTH 20  (全部的MAX_ARRAY_LENGTH 替换为 20)字符串

 

#include <stdio.h>     原型

#include "myheader.h"   (这两行指令告诉 CPP 从系统库中获取 stdio.h,并添加文本到当前的源文件中。下一行告诉 CPP 从本地目录中获取 myheader.h,并添加内容到当前的源文件中。)编译器

 

b.预约义宏:io

不能修改的预约义宏,能够根据状况使用:编译

__DATE__    当前日期,一个以 "MMM DD YYYY" 格式表示的字符常量。

 __TIME__       当前时间,一个以 "HH:MM:SS" 格式表示的字符常量

__FILE__        这会包含当前文件名,一个字符串常量。

__LINE__      这会包含当前行号,一个十进制常量。

__STDC__     当编译器以 ANSI 标准编译时,则定义为 1。

 

c.预处理器运算符:

宏延续运算符(\):一个宏一般写在一个单行上。可是若是宏太长,一个单行容纳不下,则使用宏延续运算符.

字符串常量化运算符(#):在宏定义中,当须要把一个宏的参数转换为字符串常量时,则使用字符串常量化运算符(#)。在宏中使用的该运算符有一个特定的参数或参数列表.

标记粘贴运算符(##):宏定义内的标记粘贴运算符(##)会合并两个参数。它容许在宏定义中两个独立的标记被合并为一个标记。

 

d.参数化的宏:

CPP 一个强大的功能是可使用参数化的宏来模拟函数:

int square(int x)

{

 

return x * x;

}

 

这段代码能够用宏重写:

#define square(x) ((x) * (x))      //注意全部的参数都要括号,否则运算错误

 

 

2.头文件调用:

 

头文件是扩展名为 .h 的文件,包含了 C 函数声明和宏定义,被多个源文件中引用共享。有两种类型的头文件:程序员编写的头文件和编译器自带的头文件。

在程序中要使用头文件,须要使用 C 预处理指令 #include 来引用它。前面咱们已经看过 stdio.h 头文件,它是编译器自带的头文件。

引用头文件至关于复制头文件的内容,可是咱们不会直接在源文件中复制头文件的内容,由于这么作很容易出错,特别在程序是由多个源文件组成的时候。

A simple practice in C 或 C++ 程序中,建议把全部的常量、宏、系统全局变量和函数原型写在头文件中,在须要的时候随时引用这些头文件。

 

a.引用:

#include <file>  //引用的是编译器的类库路径里面的头文件。

或者 

#include "file"  //引用的是你程序目录的相对路径中的头文件,若是在程序目录没有找到引用的头文件则到编译器的类库路径的目录下找该头文件。

均可以。

 

 

b.具体操做:

#include 指令会指示 C 预处理器浏览指定的文件做为输入。预处理器的输出包含了已经生成的输出,被引用文件生成的输出以及 #include 指令以后的文本输出。

 

int x;

#include "header.h"     // 假如头文件里只有“char *test (void);” ,这一段就会被那句话替代

 

int main (void) {

puts (test ());

}

 

c. 只引用一次:

若是一个头文件被引用两次,编译器会处理两次头文件的内容,这将产生错误。为了防止这种状况,标准的作法是把文件的整个内容放在条件编译语句中.

 

#ifndef HEADER_FILE

#define HEADER_FILE

。。。 //头文件列表

#endif

 

d.有条件的引用:

有时须要从多个不一样的头文件中选择一个引用到程序中。例如,须要指定在不一样的操做系统上使用的配置参数:

 

#if SYSTEM_1

# include "system_1.h"

#elif SYSTEM_2

# include "system_2.h"

#elif SYSTEM_3

...

#endif

 

可是若是头文件比较多的时候,这个方法不是很好,因此咱们用下面:

 

#define SYSTEM_H "system_1.h"

...

#include SYSTEM_H

 

SYSTEM_H 会扩展,预处理器会查找 system_1.h,就像 #include 最初编写的那样。SYSTEM_H 可经过 -D 选项被您的 Makefile 定义。

 

 

 

sub:在有多个 .h 文件和多个 .c 文件的时候,每每咱们会用一个 global.h 的头文件来包括全部的 .h 文件,而后在除 global.h 文件外的头文件中 包含 global.h 就能够实现全部头文件的包含,同时不会乱。方便在各个文件里面调用其余文件的函数或者变量。

相关文章
相关标签/搜索