1.宏中定义函数存在问题,它并不是真正的函数
#define BAND(x) (((x) > 5 && *x) < 10) ? (x) : 0)
int main(){
for (int i = 4; i < 11; i++){
int a = i;
cout << "a = " << a << endl << '\t';
cout << "BAND(++a) = " << BAND(++a) << endl;
cout << "\t a = " << a << endl;
}
}
结果:
a=4
BAND(++a)=0
a=5
a=5
BAND(++a)=8
a=8
a=6
BAND(++a)=9
a=9
a=4
BAND(++a)=0
a=5
....
a=4时,因为第一个条件不满足,那么只执行了一次自加操作;a=5时,++a=6,满足条件,再判断第二个++a=7,之后赋值++a=8。
C++中使用内联函数来实现,内联函数怎么看都是函数,但是它会在适当的地方像宏一样展开,节省了函数调用的开销。
内联函数有两处不能用,当函数代码过于复杂时,或者要显式或隐式地取函数地址。
内联知识编译器的建议,并不强迫内联。
构造函数和析构函数看起来足够简单使用内联,但实际上二者可能隐式地嵌套调用,并不简单。所以内不内联,还是要结合具体问题具体分析的。
欢迎扫描二维码关注微信公众号 深度学习与数学 [每天获取免费的大数据、AI等相关的学习资源、经典和最新的深度学习相关的论文研读,算法和其他互联网技能的学习,概率论、线性代数等高等数学知识的回顾]