#include<iostream>
using namespace std;
#define max(a,b) (((a)>(b)? (a):(b)))
int main()
{
int a=10;
int b=0;
int c=max(++a,++b);
cout<<"a:"<<a<<"  b:"<<b<<"  c:"<<c<<endl;
return 0;
}

输出:
a:12, b:1, c:12

#include<iostream>
using namespace std;
template<typename T>
T getMax(const T& a, const T& b)
{
return a>b?a:b;
}
int main()
{
int a=10;
int b=0;
int c=getMax(++a,++b);
cout<<"a:"<<a<<"  b:"<<b<<"  c:"<<c<<endl;
return 0;
}

输出:
a:11, b:1, c:11

宏替换使得(++a)被运算两次,也就产生了错的结果,而函数模板中参数只被计算一次,避免了这种情况。

利用宏定义实现函数的模板是不安全的,但是它效率高些。

利用C++的函数模板来实现更安全些。