目录
一.内联函数
1.使用场合和定义
记得以前看宏定义的时候看到说,为了尽量发挥编译器的作用,不提倡使用宏定义,而是建议用const常量和内联函数.
使用场合:协调效率和可读性之间的矛盾.
int IsNumber(char ch) { return ch>='0'&&ch<='9'?1:0;}
int main()
{
char ch;
while(cin.get(ch),ch!='\n')
{
if(IsNumber(ch))
cout<<"yes"<<endl;
}
return 0;
}
每次调用IsNumber函数花费很多时间效率低,但是若是直接嵌入代码可读性太差.
这时使用内敛函数:
inline int IsNumber(char ch) { return ch>='0'&&ch<='9'?1:0;}
他与一般函数不同之处只在于函数调用的处理。一般函数进行调用时要将程序执行权转到被调用函数中,然后在返回调用他的函数中;编译器在编译过程遇到inline时,将为该函数建立一段代码,在每次调用时直接将该段代码嵌入到被调用函数当中,从而将函数调用方式变为顺序执行方式.
2.注意事项
(1)在内敛函数内不允许用循环语句和开关语句(嵌套,while都不行).若有,则编译器将该函数视为普通函数那样调用代码,递归函数(自己调用自己)是不能作为内联函数的。内联函数只适用于1—5行的小函数。
(2)内联函数的定义必须出现在内联函数第一次被调用之前。(建议放在头文件)
二.宏定义
(1)简单的宏定义:
- #define <宏名> 常量串
- 例: #define PI 3.1415926
(2) 带参数的宏定义
- #define <宏名> (<参数表>) 表达式串
- 例: #define A(x) x*x
一个讲得很详细的链接:指路
三.条件编译指令
条件编译指令包括:
#if #else #ifdef #ifndef #endif #undef
1.用宏名作为编译条件
格式
#ifdef 宏名
程序
#else
程序
#endif
程序可以是一般程序或是编译预处理指令,可以在前面安排宏定义来控制编译不同的程序段.(用处一)
比如在程序调试期间,为了输出一些语句
#define DEBUG
#ifdef DEBUG
cout<<"a="<<a;
#endif
调试完程序之后删除#define DEBUG就好了.
#ifndef意思就是#ifdef的反过来,当没有定义的时候.
#undef指令用来取消#define指令所对应的符号,和#define一起组合用来打开和关闭符号
我自己用的场合和报错情况:
#ifndef LOOPCLOSING_H
#define LOOPCLOSING_H
#ifndef DEBUG
#define DEBUG
#endif
正文
#endif
#ifndef DEBUG
#define DEBUG
#endif//DEBUG
#ifndef KEYFRAMEDATABASE_H
#define KEYFRAMEDATABASE_H
正文代码
#endif//KEYFRAMEDATABASE_H
但是如果把DEBUG的endif放在后面 就会报错 一给磨牙???
用处二:防止文件重复包含的问题
一般来说头文件<iostream.h>里面包含<mem.h>的,但是有可能会有用户同时包含这两个文件,导致mem.h的重复包含
所以在mem.h里以下宏定义
#define MEM_H
在iostream.h中也有如下条件包含指令
#ifndef MEM_H
#include<mem.h>
#endif
2.用表达式的值作为编译条件
格式
#if 表达式
程序
#else
程序
#endif