预处理命令

预处理命令

  • 宏定义
  • 文本包含
  • 条件编译

1.宏定义

  • 在C语言源程序中允许用一个标识符来表示一个字符串,称为“宏”。被定义为“宏”的标识符称为“宏名”。在编译预处理时,对程序中所有出现的“宏名”,都用宏定义中的字符串去代换,这称为“宏代换”或“宏展开”
  • 宏定义是由源程序中的宏定义命令完成的。宏代换是由预处理程序自动完成的。
  • 在C语言中,宏分为有参数和无参数两种。

1.1无参数的宏定义

声明无参数宏一般形式为:

 #define 标识字符串

     其中的“#”表示这是一条预处理命令,凡是以“#”开头的均为预处理命令。“ define"为宏定义命令,“标   识符“为所定义的宏名,”字符串”可以是常数、表达式、格式串等。
    在前面介绍过的符号常量的定义就是一种无参宏定义。此外,常对程序中反复使用的表达式进行宏定义
     例如:
  define M (y*y+3)
    它的作用是指定标识符M来代替表达式(y*y+3).在编写源程序时,所有的(y*y+3)都可由M代替,而对源程序作编译时,将先由预处理程序进行宏代换,即用(y*y+3)表达式去置换所有的宏名M,然后再进行编译.



// 预处理.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#define M 3.1415926


int _tmain(int argc, _TCHAR* argv[])
{
	printf("%f",M);
	return 0;
}

结果:


1.2有参数的宏定义

有参数的宏类似于有参数的函数,其定义的一般形式为:

 #define 标识符(形象表) 字符串

如果有多个形参,像函数参数一样已逗号隔开。在程序中使用有参数宏的形式是:

标识符(实参表)

例如:

#include "stdafx.h"


#define _S(r) 3.1415926*r*r


int _tmain(int argc, _TCHAR* argv[])
{

	int r;
	printf("请输入一个圆的半径\n");
	scanf("%d",&r);

	printf("面积为:%f",_S(r));
	getchar();
	return 0;
}

结果:


2.文件包含


●文件包含是C预处理程序的另一个重要功能。
●文件包含命令行的一般形式为:
# include"文件名"
在前面我们已多次用此命令包含过库函数的头文件。例如:
 #include"stdio. h
 #include math. h
文件包含命令的功能是把指定的文件插入该命令行位置取代该命令行,从而把指定的文件和当前的源程序文件连成一个源文件。
在程序设计中,文件包含是很有用的。一个大的程序可以分为多个模块由多个程序员分别编程。有些公用的符号常量或宏定义等可单独组成一个文件,在其它文件的开头用包含命令包含该文件即可使用。这样,可避免在每个文件开头都去书写那些公用量,从而节省时间,并减少出错。

3.条件编译


预处理程序提供了条件编译的功能。可以按不同的条件去编译不同的程序部分,因而产生不同的目标代码文件。这对于程序的移植和调试是很有用的。

以下的 #ifndef 相当于if(!程序段),其他的和if else用法一样

1、第一种形式:                       

#ifdef 标识符

程序段1

#else

程序段2

#endif

#include "stdafx.h"

//如果定义M的话执行定义N,否则定义O
#ifdef M "我是M"

#define N "我是N"

#else

#define O "我是O"

#endif

int _tmain(int argc, _TCHAR* argv[])
{
	return 0;
}


2、第二种形式:                       

#ifndef 标识符

程序段1

#else

程序段2

#endif

#include "stdafx.h"

//如果没有定义M的话执行定义N,否则定义O
#ifndef M "我是M"

#define M "我是M"

#else

#define O "我是O"

#endif

int _tmain(int argc, _TCHAR* argv[])
{
	return 0;
}


3、第三种形式

#if 常量表达式

程序段1

#else

程序段2

#endif


这个相当于if  else



posted @ 2018-03-26 19:43  马春海的编程博客  阅读(319)  评论(0编辑  收藏  举报