程序编辑预处理

一、文件包含命令

1.文件包含命令的功能是把指定的文件插入该命令行位置取代该命令行,从而把指定的文件和当前的源程序连成一个完整的文件。(代码重用)

2.写法(调用方式):

1)#include "stdio.h":首先在当前的源文件目录中查找,若未找到则到系统目录去查找。

2)#include <stdio.h>:在包含文件目录中去找,而不在源文件目录中去找。

3.创建头文件:

//创建头文件并命名 func.h
//直接构造函数
int min(int a,int b)
{
    return a>b?b:a;
}
int max(int a,int b)
{
    return a>b?a:b;
}

二、宏定义#define

1.无参宏定义

1)定义:#define 标识符 字符串(字符串可以是常数、表达式、格式串等)

2)用法:

#define DEMO (x*x*x+2*x)
int main()
{
    int s,x;
    printf("input a number:");
    scanf("%d",&x);
    s=3*DEMO+4*DEMO+5*DEMO;
    printf("s=%d\n",s);
)

3)如要终止宏定义的作用域可使用#undef

#define PI 3.1
void f1()
{
    float s;
    s=3*PI;
    printf("在main函数中s=%f\n",s);
    f1();
}
#undef PI
#define PI 3.14    //在f1中重新弄定义了PI的数据
void f1()
{
    int s;
    s=3*PI;
    printf("在f1函数中s=%d\n",s);
}
//运行结果为 在main函数中s=9.300000/在f1函数中s=9

4)宏定义可表示数据类型:宏定义只是简单的字符串代换,是在预处理完成的,而typedef是在编译时处理的,它不是做简单的代换,而是对类型说明符重新命名。

#define PIN1 int*
typedef (int*) PIN2;
//PIN1 a,b;在宏代换后变成int *a,b;表示a是指向整形的指针变量,而b是整形变量
//PIN2 a,b;表示a、b都是指向整形的指针变量

3.带参宏定义

1)定义:在宏定义中的参数称为形式参数,在宏调用中的参数称为实际参数

带参宏定义的一般形式为:#define 宏名(形参表) 字符串

带参宏调用的一般形式为:宏名(实参表);

2)在带参宏定义中,形式参数不分配内存单元,因此不必做类型定义。而宏调用中的实参有具体的值,要用它们去代换形参,所以必须做类型说明。

#define SQ(y) (y)*(y)
int main()
{
    int a,sq;
    printf("input a number:");
    scanf("%d",&a);
    sq=SQ(a+1);
    printf("sq=%d\n:,sq);
}
//其中sq=(a+1)*(a+1),若将宏定义改为#define SQ(y) y*y,则sq=a+1*a+1
//函数调用和宏调用两者在形式上相同,在本质上是完全不同的

三、典型的宏定义重要概念

1.数值宏常量

#define 宏定义可以出现在代码的任何地方,从该行宏定义开始,以后的代码中设计定义的内容就都用宏代替。但define宏定义的数据没有类型,可在定义一些宏常数的时候用const来代替,减少错误的可能。(const关键字:只要一个变量前用const来修饰,就意味着该变量里的数据只能被访问,而不能被修改,也是就“只读”。)

2.字符串宏常量

例如文件处理中关于路径的描述:

#define PATH E:\\demo\\code\\c\\package

3.用define宏定义注释符号

#define BSC //
BSC my single-line comment //错误的

因为注释先于预处理命令被处理,所以试图用宏开始或结束字段注释是不行的

4.用define宏定义表达式

四、条件编译

1.形式1

#ifdef 标识符
    程序段1
#else
    程序段2
#endef
//其功能为:如果标识符已被#define命令定义过则对程序段1进行编译;否则对程序段2进行编译

1)例子

#define NUM ok    //已对NUM做过宏定义,因此应对第一个printf语句做编译,所以输出了学号和成绩
int main()        //只有取消程序的第一行才会去编译第二个printf语句
{
    struct stu
    {
        int num;
        char *name;
        char sex;
        float score;
    } *ps;
    ps=(struct stu*)malloc(sizeof(struct stu));
    ps->num=102;
    ps->name="Zhang ping";
    ps->sex='M';
    ps->score=62.5;
#ifdef NUM
    printf("Number=%d\nScore=%f\n",ps->num,ps->score);
#else
    printf("Name=%s\nSex=%c\n",ps->name,ps->sex);
#endef
free(ps);
}

2.形式2

#ifndef 标识符        //如果标识符未被#define定义过,则对程序段1进行编译,否则对程序段2进行编译。
    程序段1           //着与第一种形式的功能正相反
#else
    程序段2
#endef

3.形式3

#if 常量表达式
    程序段1
#else
    程序段2
#endef

功能:若常量表达式的值为真(非0),则对程序段1进行编译,否则对程序段2进行编译。

例子

#include <stdio.h>
#define R 1
int main()
{
	float c, r, s;
	printf("input a number:");
	scanf_s("%f", &c);
#if R
	r = 3.14159*c*c;
	printf("area pf round is:%f\n", r);
#else
	s = c * c;
	printf("area of square is:%f\n", s);
#endif
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值