C++笔记_记录我容易遗忘的知识点

目录

一.内联函数

1.使用场合和定义

2.注意事项

二.宏定义

三.条件编译指令

1.用宏名作为编译条件

2.用表达式的值作为编译条件


一.内联函数

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)简单的宏定义:

  1. #define <宏名>  常量串
  2. 例: #define PI 3.1415926

(2) 带参数的宏定义

  1. #define <宏名> (<参数表>) 表达式串
  2. 例: #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

猜你喜欢

转载自blog.csdn.net/zhengbq_seu/article/details/82021455