在说内联函数和带参数的宏之前,先说一下我们编译器的编译过程。我们写好了程序到程序产生二进制的文件执行这个过程,编译器一般会经过1、预编译2、编译3、汇编4、链接这几个过程。而学过编译原理的人都知道编译的过程是1、词法分析2、语法分析3、语义分析4、生成中间代码5、代码优化6、代码生成,这几个过程,其实这里的编译原理这几个过程对应的就是我上边说的那四个步骤的第二个步骤,其实汇编的那个过程和编译的这些过程也是差不多的。经过2、编译以后产生的是汇编代码,而3、汇编就是将汇编代码汇编为机器指令,最后4、链接的时候就是链接一些我们需要的库。好了,有了上述这个基本的感念,我们看下内联函数和带参数的宏是在哪个过程中的。带参数的宏是在预处理的时候在调用的地方被替换掉的,参数就是单纯的替换,而内联是在编译的这一步做的。下面看看他么程序中的具体用法。

//类的头文件
#ifndef _MY_CLASS_H_
#define _MY_CLASSS_H_

#include <iostream>

using namespace std;
//C/C++编译过程主要分为4个过程
//1) 编译预处理 你在程序中看到的以#开头的那些语句段一般都是在这个阶段处理的,比如宏定义,条件编译,头文件包含等等
//2) 编译、优化阶段
//3) 汇编过程
//4) 链接程序
//宏定义是在预处理时直接替换的,而内联函数是在编译期间插入代码。宏定义替换比内联函数执行得早
//带参数的宏,最好用括号将参数括起来,在c++中尽量使用内联函数而不是宏
#define CCLog(var) cout<<(var)<<endl;

class MyClass
{
public:
	void function();
	//如果函数的定义位于类声明中,那么这个函数就是一个内联的函数,写成内联函数的一般都是比较短小的语句块
	int getName(){return 20;};
};
//内联函数就写在.h头文件中就可以了,不要写在.cpp文件中,因为内联函数是在编译的时候替换掉调用它的代码的
//在main中引用这个function函数的时候编译的时候要找这个function,如果不写在头文件中是找不到它的实现的
//或者你在main中包含.cpp文件也可以,这样的话就找到了
//需要在这里定义的时候返回值类型的前边加上inline,这种定义方法和上边写在雷声明中是等同的
inline void MyClass::function()
{
	cout<<"inline!\n"<<endl;
}

#endif
#include "MyClass.h"

int main()
{
	MyClass a;
	//出现无法解析的外部符号一般都是有了声明没有实现或者是少了一些库导致的
	a.function();

	CCLog("宏定义\n");

	return 0;
}

宏定义一般都是将宏大写以便知道这是个宏定义。之所以将内联写到头文件中,是因为当我们在main.cpp中调用这个内联的时候,第一步预处理的时候头文件被包含进来,第二步编译的时候内联函数就要展开了,如果这个时候头文件中没有内联的具体实现,当然就会报错了,谁让你现在就要展开呢?而普通的函数调用是在链接的时候将.cpp文件生成的目标文件.o和他们链接起来的,当然就可以找到了。关于宏定义和内联的其他区别请留言讨论。