宏是由由预处理器preprocessor处理的.
inline函数是由编译器compiler处理的.
宏 没有类型检测 直接替换
预处理器不能访问类的成员变量,因此不能作为成员函数。
宏没有对于成员访问范围的概念。
内联函数
编译器将函数类型包括函数名、参数个数及其类型还有返回值类型保存在符号表中,
当函数体的语法无误时将其实现也保存在符号表中,
什么时候不能使用内联
当函数的功能过于复杂时,编译器不会实施内联,这取决于编译器,但通常情况下,循环或者过多的代码不会被内联,因为此时代码执行的时间可能比函数调用的时间多很多,内联失去了意义。
另外一种情况是需要显式或隐式的得到某函数的地址时,编译器要产生地址则必须为其分配内存空间;而进行内联替换时只是将其保存在符号表中,并不为其分配空间。
内联中的前向引用
当在内联函数中调用了类中还未声明的函数怎么办呢?
这种情况,编译器仍然可以将其内联,因为语法规则表明只有到类声明的“}”处才进行内联函数的替换。
//: C09:EvaluationOrder.cpp
// Inline evaluation order
class Forward {
int i;
public:
Forward() : i(0) {}
// Call to undeclared function:
int f() const { return g() + 1; }
int g() const { return i; }
};
int main() {
Forward frwd;
frwd.f();
} ///:~