预处理命令

预处理命令

重点:

        午餐宏定义和有参宏定义;

        文件包含;

        条件编译。

一、宏定义

        C语言标准允许在程序中用一个标识符来表示字符串,称为宏。标识符为宏名,在编译预处理时,将程序中所有的宏名用相应的字符串来替换,这个过程称为宏替换,宏分为两种:无参数宏和有参数宏。

            1.无参数宏

                        无参数宏定义一般形式:
                        #define  标识符字符串
                      “#”代表本行是编译预处理命令。define是宏定义的关键词,标识符是宏名。字符串是宏名所代替的内容,可以是常数、表达式等。
                    例:使用无参数宏的程序,输入半径,求圆的周长、面积和体积。
#include "stdafx.h"
#define PI 3.1415926

int _tmain(int argc, _TCHAR* argv[])
{
	float l,s,r,v;
	printf("input radius:");
	scanf("%f",&r);
	l=2.0*PI*r;
	s=PI*r*r;
	v=4.0/3.0*PI*r*r*r;
	printf("l=%10.4f\n s=%10.4f\n v=%10.4f\n",l,s,v);
	getchar();
	return 0;
}
    说明:使用宏代替一个字符串,可以减少程序中重复书写某些字符串的工作量。如果没有使用宏,那么就要查找程序并修改所有的PI值。宏的作用范围是从宏定义开始到源程序文件结束为止。

            2.有参数宏

                        有参数的宏类似于有参数的函数,其定义的一般形式:
                         #define 标识符(形参表)字符串
                         如果有多个形参,像函数参数一样以逗号隔开。在程序中使用有参数宏的形式是:
                        标识符(实参表)
                    例:演示有参宏的实现方法
#include "stdafx.h"
#define MAX(x,y) (x>y?x:y)

int _tmain(int argc, _TCHAR* argv[])
{
	int a=1,b=2,max;
	max=MAX(a,b);
	printf("the max between(%d,%d)is%d\n",a,b,max);
	getchar();
	return 0;
}
    注意:宏名与形参表的圆括号之间不能有空格,否则会导致错误。在宏定义中,字符串内的形式参数最好用括号括起来,以避免错误。
        总的来说,当语句较简单时,可考虑使用宏定义,从程序执行的速度来说,它优于函数。使用宏的次数较多时,宏替换后源程序一般会变长。而函数调用不会使程序变长。宏替换不会占用运行时间,只是编译的时间稍微长一点。而函数调用则会占用运行时间。一般用宏定义代表一些较为简单的表达式比较适合。

二、文件包含

              文件包含是指把指定源文件的全部内容包括到当前源程序文件中。
              一般形式:#include “文件名”
              文件包含预定处理命令#include的作用是使一个源文件可以将另一个源文件的全部内容包含进来,把指定的文件插入命令行位置取代命令行,从而把指定文件和当前的源程序文件连成一个源程序。

三、条件编译    

            条件编译是指在特定的条件下,对满足条件和不满足条件的情况分别进行处理——满足条件时编译某些语句,不满足条件时编译一些语句。
            条件编译命令有几种模式:

                模式一:

                #ifndef 标识符
                程序段1
                #endif
                其含义是:如果没有定义标识符,则编译程序段1(既可以是语句组,也可以命令行)。
                实例:
                
#ifndef getkey
#define getkey
#include <sys/types.h>
#endif

                模式二:

                #ifndef 标识符
                程序段1
                #else
                程序段2
                #endif
                其含义是:如果没有定义标识符,就编译程序段1,否则就编译程序段2。

                模式三:

                #ifdef 标识符
                程序段1
                #endif
                其含义:如果定义了标识符,就编译程序段1,否则就不编译该程序段。
                实例:
                
#ifdef DEBUG
printf{"a=%d,b=%d",a,b};
#endif

                模式四:

                #ifdef 标识符
                程序段1
                #else
                程序段2
                #endif
                其含义是:如果定义了标识符,就编译程序段1,否则编译程序段2。

                模式五:

                #if  表达式
                程序段1
                #endif
                其含义是:如果表达式成立,则就编译程序段1,否则不编译该程序段。
                实例:
#include<stdio.h>
#define MAX(x,y) (x>y?x:y)
...
int  a=5,b=10,c;
...
#if c
c=MAX(a,b);
#endif

                模式六:

                #if  表达式
                程序段1
                #else
                程序段2
                #endif
                其含义是:如果表达式成立,就编译程序段1,否则编译程序段2。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

思丰百年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值