头文件 预处理 宏 相关介绍


一、头文件存放程序中各个部分共享的对象,较大的程序需要使用更多的头文件。


       头文件(*.h文件)可以自己写

       可以写多个源程序和多个头文件,有源程序代码中调用所需要的头文件,将头文件模块化,可以防止在出错时因为头文件程序太多而找不到出错的位置。

      调用系统库函数时,要使用#include语句将某些头文件包含进去,头文件跟.C文件一样,是可以自己写的。头文件是一种文本文件,使用文本编辑器将代码编写好之后,以扩展名.h保存就行了。

     头文件中一般放一些重复使用的代码,例如函数声明,变量声明,常数定义,宏的定义等等。当使用#include语句将头文件引用时,相当于将头文件中所有内容,复制到 #include处 。使用头文件不仅可以减少工作量,还可以减少因代码编写不细心而导致的错误。

       库函数printf 等的函数原型声明都包含在 <stdio.h> 中,因此必须要使用下述固定指令:

       #include <stdio.h>

      通过 #include 指令,就可以把 <stdio.h> 中的全部内容都读取到程序中,包含库函数原型声明的 <stdio.h>  称为头文件,取得头文件内容的#include 指令称为文件包含指令。

       C预处理器主要任务:删除注释、插入被include包括的文件内容、替换define指令定义的符号以及确定代码的部分内容是否应该根据一些条件编译指令进行编译。

      

二、预处理指令

  如:

   #include <stdio.h>

   #include <time.h>

   #include <stdlib.h>

   #include <string.h>

   #define ROWS  10   //定义行

以上都是预处理指令,它们由预处理器解释,预处理器读入源代码。根据预处理指令对其修改,把修改过的源代码交给编译器。

 

三、宏定义形式:

     #define    名字    替换文本

     替换文本可以是任意的:

      #define  M  20 ,这就是宏定义,宏定义M,在预处理过程中凡是在主程序中出现的M都会被20替换.

     替换文本不仅限于字面值常量,可以把任何文本替换到程序中:

     #define  reg  register 此定义只是帮register创建了一个简短的别名,较短的名字使各个声明更加容易通过制表符进行排列。

     #define do_forever  for( ; ; )    用一种更具描述性的符号代替实现无限循环的for语句类型。

     #define  CASE   break;case   在switch语句中使用,会自动在每个case之前自动加break。

    宏函数

     #define MAX(a,b) ((a)>(b):(a):(b))  //定义一个MAX宏函数,a大于b返回值为a,否则为b.

     这是一个宏函数,程序中可以调用宏函数解决相应问题。

    宏与类型无关,定义函数时必须定义变量的类型,和函数相比,宏函数的不利之处在于每次使用宏时,一份宏定义代码的的copy插入到程序中,除非宏非常短,否则使用宏可能会大幅度增加程序代码长度。

      宏定义时可以不给值,只定义名称,例如:

定义DEBUG,只有名称不给值,在Linux操作下更能直观地看到它预处理后的程序代码,这里的程序是在VS2013下编译运行的,程序代码如下:

     #define    _DEBUG_

#include <stdio.h>
#include <Windows.h>
#define _DEBUG_
int main()
{
#ifdef _DEBUG_ //如果定义了DEBUG,输出下面语句
printf("Hello debug\n");
#endif
printf("Hello earth\n");
system("pause\n");
return 0;
}

运行结果如图:

如果将定义DEBUG语句注释掉,运行就不会打印#ifdef后的语句,因为没有定义DEBUG,#ifdef 后的语句不会被执行

如图程序运行结果如下图:

     #if 与 #ifdef

      #if 用来检测一个宏是否被定义,定义值是否为真,如果为真执行其后语句,不为真不执行;

#ifdef  用来测试一个宏是否被定义,它的值为真为假无所谓。

    


       计算机只认识二进制,所以C语言会转化为二进制代码

C语言———预处理C语言——(通过编译)汇编——(通过汇编转为)二进制

四、预处理

        预处理过程有四步:

1.宏替换;

2.去注释;

3.头文件展开;

4.条件编译。

五、  条件编译:选择性裁减代码

语法形式如下:

        if   行文本    elif   部分   opt else 部分    #endif

if 行:

   # if 常量表达式

   # ifdef   标识符

   #ifndef    标识符

elif  部分:

      elif  行    文本   elif  部分  opt

elif  行:

     #elif     常量表达式

else  部分:

      else    行   文本

else   行:

      #else


   预定义名字某些标识符是预定义的,扩展后将生成特定信息,同预处理器表达式运算符defined 一样,不能取消定义或重新定义,如:__LINE__                     包含当前源文件行数的十进制常量__FINE__                     包含当前正在被编译的源文件名字的字符串字面值




注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
© 2014-2019 ITdaan.com 粤ICP备14056181号