C语言复习之预处理

C语言复习之预处理

在C语言中,C语言允许在源程序中加入一些“预处理指令”,以改进程序设计环境,提高效率等。但是这些预处理指令并不是由C标准建议的,所以不能用C编译系统直接对他们进行编译。因此,在对程序正式编译之前,,先对程序中这些特殊的指令进行“预处理”。


C提供的预处理功能常用的主要有一下3种:


  • 宏定义;
  • 文件包括;
  • 条件编译。

1. 宏定义

1.1 不带参数的宏定义

  • 其一般形式为:
#define 标识符 字符串
  • 其中的“#” 表示这是一条预处理命令。
  • define 为宏定义命令。“标识符”为所定义的宏名。“字符串可以是常数,表达式,格式串等。
    例如:
#define PI 3.1415926  //不能加分号

他的的作用是指定标识符PI来代替数3.1415926,这样修改代码时,可以直接修改宏定义的值,避免修改每个PI的值,减少错误的发生。
宏定义是用宏名表示一个字符串,在宏展开时又将该字符串取代宏名,字符串可以是任何字符,也可以是常数,也可以是表达式。其中,预处理程序不对宏定义做任何检查,如果宏定义出现错误,只能在编译时被宏展开后的源程序发现错误。

  • 宏定义必须定义在函数以外,作用域为宏定义命令起到源程序结束,如果需要终止其作用域,可以使用# undef命令
  • 宏名在源程序中若用引号括起来,则于是处理程序不对其作宏代换。
  • 宏定义中可以嵌套,在宏定义中使用已经定义过的宏名。
#define pi 3.14159
#define doublepi pi*2
  • 一般来说用大写字母表示,以便于分别变量。
  • 可以用宏定义表示数据类型,书写方便
define INTEGER int
  • 对“输出格式”作宏定义,可以减少书写麻烦
#define P printf
#define D "%d\n"
#define F "%f\n"

宏定义表示数据类型和typedef定义数据的区别
宏定义只是简单的替换,是在预处理完成的。而typedef是在编译时处理的,他不是单一的替换,而是对类型说明符的重新命名。被命名的标识符具有类型定义的功能。

#include
#define T char*
typedef char* Tt;
int main()
{
	T x,y;
	Tt x1,y1;
	printf("#define: %4d%4d\n",sizeof(x),sizeof(y));
	printf("typedef: %4d%4d\n",sizeof(x1),sizeof(y1));
	return 0;
} 

结果如图显示:
C语言复习之预处理_第1张图片

1.2 带参宏定义

  • C语言允许宏带有参数,参数为形式参数,在宏调用的时候称为实际参数。
  • 对带参数的宏,在调用中,不仅要宏展开,而且要用实参去代换形参。
  • 带宏惨的宏定义的形式为
#define 宏名(形参表) 字符串
#define M(y) y*y+3*y
k=M(5);//k=5*5+3*5
  • 在带参的宏定义中,形式参数不分配内存单元,因此不必作类型定义。而宏调用中的实参有具体的值,要用它的值去代换形参,因此必须说明类型。
  • 在宏定义中的形参是标识符,而宏调用中的实参可以是表达式。
  • 在宏定义中,字符串内的形参一般要用括号括起来避免出错
#define Mul(y) (y)*(y)
ans=Mul(a+1) // == (a+1)*(a+1)

#define Mul(y) y*y
ans=Mul(a+1) // == a+1*a+1
//由于乘法的优先级,会造成计算错误,因此要尽量括起来。

“文件包含”处理

  • 1.一个include命令只能指定一个被包含文件,若有多个文件需要包含,则需要用多个include命令
  • 文件包含允许嵌套,即在一个被包含的文件中又可以包含另一个文件。
    C语言复习之预处理_第2张图片
#include
#include"stdio.h"

包含命令中的文件名可以使用尖括号和双引号,但是两者有略微差别
尖括号::表示在包含的文件目录中去查找(一般是用户在设置环境时的目录),而不再源文件目录去查找。
双引号: 使用双引号则表示首先在当前的源文件目录查找,如果没查询到,再去包含目录中查找。

3.条件编译

预处理程序提供了条件了编译的功能,可以按照不同的条件去编译程序中不同的部分,因而可以产生不同的代码文件。对程序的移植和调试很有用。条件编译有以下几种方式:

#ifdef 标识符
	程序段1
else
	程序段2
#endif

作用是::若标识符已经被#define命令定义过,则在编译阶段编译程序段1,否则编译程序段。#endif是结束符。

#ifndef 标识符
	程序段1
else
	程序段2
#endif

同第一种形式相比,只是第一行不同,作用是:若指定的标识符未被定义过,则编译程序段1,否则程序段2。

#if 标识符
	程序段1
else
	程序段2
#endif

它的作用是当表达式值为真时,就编译程序段1,否则编译程序段2,可以事先给定条件,使程序在不同的条件执行不同的功能。

你可能感兴趣的:(C语言)