1 在C语言中使用宏可以提高程序效率,但宏容易出错
在宏定义中,最好给变量打上括号,否则容易出错.
宏和普通函数是有区别的,普通函数是值传递或者地址传递,但宏是简单地拷贝,特别参数是a++这种容易使a++多次执行
2 在宏里,没法表示类的作用范围.所以类中不能使用宏.转而使用内联函数
在类的声明中直接写上函数定义的默认是inline函数
内联函数和普通函数差不多,会受到编译器的检查参数列表和返回值. 但在调用时可以直接将函数直接替换成函数体,减小调用开销,
但是否内联是编译器决定的,即使明确写上inline也可能不按内联进行替换,下面两种情况是明确不能内联的:
1 函数体复杂,比如有循环就不能内联,原因是复杂的函数体替换会削弱甚至不会带来性能上的提高
2 显示或隐式地取该函数地址,编译器必须为函数体分配内存
3 向前引用
class F
{
public:
int f() const { return g()+1; }
int g() const {return 1;}
}
C++规定: 只有在类声明结束后,类中的内联函数才起作用
所以引用未声明的内部函数是可以的
4 内联无法取代宏的地方:
字符串定义: 将任意标识符转换成字符串数组
#define F(s) cout<< #s << endl; s ;
标志粘贴:
#define D1(x) int x##one;
#define D2(x) int x##two;
head.h
#ifndef HEAD_H
#define HEAD_H
#define F(s) cout<< #s << endl; s ;
#define D1(x) int x##one;
#define D2(x) int x##two;
class Forward
{
public:
int f() {return g() +1;}
int g() {return 1;}
};
#endif
main.cpp
#include <string>
#include <iostream>
#include "head.h"
using namespace std;
int main()
{
F(cout << "abc" << endl;);
D1(num);
D2(num);
numone = 100;
numtwo = 200;
F(cout<<numone << ' ' << numtwo << endl;);
Forward f1;
cout << f1.f() << endl;
cout << f1.g() << endl;
}
zhao@ubuntu:~/c++work/cpp9$ ./a.out
cout << "abc" << endl;
abc
cout<<numone << ' ' << numtwo << endl;
100 200
2
1