码迷,mamicode.com
首页 > 其他好文 > 详细

编译预处理和动态存储分配(1)

时间:2016-04-15 00:33:27      阅读:150      评论:0      收藏:0      [点我收藏+]

标签:

1 编译预处理

  C语言中,凡是以“#”号开头的行,都称为“编译预处理”命令行。C语言的预处理命令有:#define, #undef, #include, #if, #else, #elif, #endif, #ifdef, #ifndef, #line, #pragma, #error。

  1.1 宏替换

  1.1.1 不带参数的宏定义

  (1)不带参数的宏定义命令行形式如下:

    #define  宏名  替换文本

  在#define、宏名和宏替换文本之间用空格隔开。例如:

    #define  SIZE  100

  (2)替换文本中可以包含已定义过的宏名,例如:

    #define  PI        3.14

    #define  ADDPI      (PI + 1)

    #define  TWO_ADDPI   (2 * ADDPI)

  (3)当宏定义在一行中写不下,需要在下一行继续时,只需在最后一个字符后紧接着加一个反斜线“\”。例如:

    #define  LEAP_YEAR  year % 4 == 0\

    && year % 100 != 0 || year % 400 == 0

  如果在“\”前或在下一行的开头留有空格,则在宏替换时也将加入这些空格。

  (4)同一宏名不能重复定义,除非两个宏定义命令行完全一致。

  (5)替换文本不能替换双引号中与宏名相同的字符串。例如,如果YES是已定义的宏名,则不能用与它相关的替换文本来替换 printf("YES") 中的YES。

  (6)替换文本不会替换用户标识符中的成分。例如,宏名 YES,不会替换标识符 YESORNO 中的 YES。

  (7)用作宏定义的标识符通常用大写字母表示,这并不是语法规定,只是一种习惯,便于与程序中的其他标识符相区别。

  (8)C程序中,宏定义的定义位置一般写在程序的开头。

  1.1.2 带参数的宏定义

  (1)带参数的宏定义命令行形式如下:

    #define  宏名( 形参表 )  替换文本

  例如:

    #define  MU(X, Y)  ((X) * (Y))

  以上宏定义命令行中,MU(X, Y) 简称为“宏”,MU是用户标识符,称为宏名。宏名和左括号 "(" 必须紧挨着,它们之间不得留有空格。其中一对圆括号中由若干称为形参的标识符组成,各形参之间用逗号隔开。“替换文本”中应包含有形参。

  (2)和不带参数的宏定义相同,同一宏名不能重复定义,除非两个宏定义命令行完全一致。

  (3)在调用带参数的宏名时,一对圆括号必不可少,圆括号中实参的个数应该与形参个数相同,若有多个参数,它们之间用逗号隔开。在预编译时,编译预处理程序用“替换文本”来替换宏,并用对应的实参来替换“替换文本”中的形参。

  (4)在“替换文本”中的形参和整个表达式应该用括号括起来,例如:

    #define  MU(x, y)  ( (x) * (y) )

  (5)宏替换和函数调用有相似之处,但在宏替换中,对参数没有类型要求。例如,调用 MU,既可以求两个整型数的乘积,也可求两个实型数的乘积。而如果是调用函数来求两个数的乘积,则对不同类型的参数就需要定义不同的函数。

  (6)宏替换是在编译前由预处理程序完成的,因此宏替换不占用运行时间。而函数调用是在程序运行时进行的,在函数调用过程中需要占用处理时间。

  1.1.3 终止宏定义

  可以用 #undef 提前终止宏定义的作用域。例如:

    #define PI 3.14

    main()

    ...

    #undef PI

    ...

  以上 PI 的作用域从#define PI 3.14 命令行开始,到#undef PI 命令行结束。从#undef 之后 PI 变成无定义,不再代表3.14。

  1.2 文件包含

  C语言开发程序时,可以把一些宏定义按照功能分别存入不同的文件中。当需要使用某类宏定义时,就无需在程序中重新定义,而只要把这些宏定义所在的文件包含在程序的开头就可以了。

  所谓文件包含,是指在一个文件中去包含另一个文件的全部内容。C语言用#include 命令行来实现文件包含的功能。#include 命令行的形式如下:

    #include  "文件名"

  或

    #include  <文件名>

  预编译时,预编译程序将用指定文件中的内容来替换此命令行。a.如果文件名用双引号括起来,系统先在源程序所在的目录内查找指定的包含文件,如果找不到,再按照系统指定的标准方式到相关目录中查找;b.如果文件用尖括号括起来,系统将直接按照系统指定的标准方式到有关目录查找。

  说明:

  (1)包含文件的#include 命令行通常应书写在所用源程序文件的开头,故包含文件又称作“头文件”。头文件名可以由用户指定,其后缀不一定用“.h”。

  (2)包含文件中,一般包含有一些公用的#define命令行、外部说明或对库函数的原型说明。例如 stdio.h 就是这样的头文件。

  (3)当包含文件修改后,对包含文件的源程序必须重新进行编译连接

  (4)一个程序中,允许有任意多个#include命令行。

 

编译预处理和动态存储分配(1)

标签:

原文地址:http://www.cnblogs.com/web1013/p/5393502.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!