c语言----预处理

不带参数的宏

宏定义指令#define 用来定义一个标识符和一个字符串,以这个标识符来代表这个字符串,在程序中每次遇到该标识符时就用所定义的字符串替换它。它的作用相当于给指定的字符串起一个别名。

不带参数的宏的一般形式如下

#define 宏名 字符串
  • "#"表示这是一条预处理命令。
  • 宏名是一个标识符,必须符合C语言标识符的定义。
  • 字符串可以是整数,表达式,格式字符串等。
  • 宏定义用于预处理命令,它不同于定义的变量,只做字符替换,不分配内存

例如:

#define PI 3.14159

它的作用是在程序中用PI替代3.14159 ,在编译预处理时,每当在源程序中遇到PI时将自动转换为3.14159

  • 可以用 #undef命令来终止宏定义的作用域。

带参数的宏

带参数的宏不仅是简单的字符替换,还可以进行参数替换。一般形式如下:

#define 宏名(参数表) 字符串
//参数表里的参数叫实参,字符串中为形参。

例如:对两个数实现乘法和加法的混合运算。

#include<stdio.h>
#define MIX(a,b) ((a)*(b)+(b))

void main(){
int x = 5,y = 9;
printf("%d\n",MIN(x,y))
return 0;
}
  1. 用宏替换函数的好处:是宏替换增加了代码的执行速度,因为不存在函数调用。但是也由于重复编码而增加了程序的长度。

对于带参数的宏有以下几点需要注意:

1.宏定义时参数要加括号,若不加括号,有时结果对有时错。

  1. 宏扩展必须使用括号来保护表达式中低优先级的操作符,以便确保得到想要的结果。
  2. 对带参数的宏的展开只是将语句中的宏后面括号内的实参字符串代替#define命令行中的形参。
  3. 在宏定义时,宏名与带参数的括号之间不可以以加空格,否则将空格以后的字符串都作为替换字符串的一部分。
  4. 在带参数的宏中,形式参数不分配内存单元,因此不必做类型定义。

头文件

一般情况下将以下内容放到.h文件中:

  • 宏定义。
  • 结构体、联合和枚举声明。
  • typedef 声明。
  • 外部函数声明。
  • 全局变量声明。

使用头文件有以下几点需要注意:

  1. 文件包含是可以嵌套的,即在一个被包含文件中还可以包含另一个被包含文件。
  2. 当file1.h 中包含file2.h,预编译后就成为一个文件而不是两个文件,这是如果file2.h中有全局静态变量,则该变量在file1.h中也有用,不需要再用extern声明。

条件编译

#if 命令

#if的基本含义是,如果#if命令后的参数表达式为真,则编译#if#endif之间的程序段,否则跳过这段程序。#endif命令用来表示#if段的结束。

一般格式如下:

#if 常数表达式
	语句段
# endif
  • 如果常数表达式为真,则这段程序会编译,否则跳过。

例如:

#include<stdio.h>
#define NUM 50
void main(){
	int i = 0;
	#if NUM>50 
		i++;
	#endif
	#if NUM==50
		i = i+50;
	#endif
	printf("%d\n",i);
return 0;
}

#else 与#elif

  • #else:的作用是当#if为假时提供另一种选择,作用和条件判断中的else相似。
  • #elif:用来建立一种 “如果…或者如果…”的形式。

#ifdef及#ifndef命令

#if条件编译命令中,需要判断符号常量所定义的具体值,但有时并不需要判断具体值,只需要知道这个符号常量是否被定义了,这时就需要采用另一种条件编译的方法,即#ifdef#ifndef命令,它们分别表示“如果有定义”和“如果无定义”。

#ifdef命令的一般形式:

#ifdef 宏替换名
语句段
#endif

其意义是:如果宏替换名已经被定义过,则对“语句段”进行编译。

#ifndef命令的一般形式:

#ifndef 宏替换名
语句段
#endif

其意义是:如果宏替换名没有被定义过,则对“语句段”进行编译。

#progma命令

#progma命令的作用是设定编译器的状态,或者指示编译器完成一些特定的动作。

一般形式如下:

#progma 参数

参数可以是以下几种情况:

  • message参数:该参数能够在编译信息输出窗口中输出相应的信息。
  • code_seg参数:设置程序中函数代码存放的代码段。
  • once参数:保证头文件被编译一次。

预定义宏名

ANS标准说明了5个预定义宏替换名

  • **_LINE_**:其含义是当前被编译代码的行号。
  • _FILE_:其含义是当前源程序的文件名称
  • _DATE_:其含义是当前源程序的创建日期
  • _TIME_:其含义是当前源程序的创建时间
  • _STDC_:其含义是用来判断当前编译器是否为标准C,其值为1表示符合,否则不是。

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

落春只在无意间

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

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

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

打赏作者

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

抵扣说明:

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

余额充值