宏
不带参数的宏
宏定义指令
#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.宏定义时参数要加括号,若不加括号,有时结果对有时错。
- 宏扩展必须使用括号来保护表达式中低优先级的操作符,以便确保得到想要的结果。
- 对带参数的宏的展开只是将语句中的宏后面括号内的实参字符串代替#define命令行中的形参。
- 在宏定义时,宏名与带参数的括号之间不可以以加空格,否则将空格以后的字符串都作为替换字符串的一部分。
- 在带参数的宏中,形式参数不分配内存单元,因此不必做类型定义。
头文件
一般情况下将以下内容放到.h
文件中:
- 宏定义。
- 结构体、联合和枚举声明。
- typedef 声明。
- 外部函数声明。
- 全局变量声明。
使用头文件有以下几点需要注意:
- 文件包含是可以嵌套的,即在一个被包含文件中还可以包含另一个被包含文件。
- 当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表示符合,否则不是。