预处理宏的问题
来源:互联网 发布:死亡扳机2网络通信失败 编辑:程序博客网 时间:2024/05/28 11:29
在c中我们经常把一些短并且执行频繁的计算写成宏,而不是函数,这样做的理由是为了执行效率,宏可以避免函数调用的开销,这些都由预处理来完成。
但是在c++出现之后,使用预处理宏会出现两个问题:
第一个在c中也会出现,宏看起来像一个函数调用,但是会有隐藏一些难以发现的错误。
第二个问题是c++特有的,预处理器不允许访问类的成员,也就是说预处理器宏不能用作类类的成员函数。
预处理宏的缺陷
预处理器宏存在问题的关键是我们可能认为预处理器的行为和编译器的行为是一样的。当然也是由于宏函数调用和函数调用在外表看起来是一样的,因为也容易被混淆。
但是其中也会有一些微妙的问题出现:
问题一:
#define ADD(x,y) x+y
inline int Add(int x,int y){
return x + y;
}
void test(){
int ret1 = ADD(10, 20) * 10; //希望的结果是300
int ret2 = Add(10, 20) * 10; //希望结果也是300
cout << "ret1:" << ret1 << endl; //210
cout << "ret2:" << ret2 << endl; //300
}
//可以通过把x+y换成(x+y)解决
问题二:
#define COMPARE(x,y) ((x) < (y) ? (x) : (y))
int Compare(int x,int y){
return x < y ? x : y;
}
void test02(){
int a = 1;
int b = 3;
//cout << "COMPARE(++a, b):" << COMPARE(++a, b) << endl; // 3原因在于预处理替换出两次++a,a变成了3
cout << "Compare(int x,int y):" << Compare(++a, b) << endl; //2++a运行之后作为参数传入函数,不会出现两次替换++a的问题
}
//无法避免
问题三:
预定义宏函数没有作用域概念,无法作为一个类的成员函数,也就是说预定义宏没有办法表示类的范围。//无法避免
为了保持预处理宏的效率又增加安全性,而且还能像一般成员函数那样可以在类里访问自如,c++引入了内联函数(inline function).
内联函数继承课宏函数的效率,没有函数调用时开销,然后又可以像普通函数那样,可以进行参数,返回值类型的安全检查,又可以作为类的成员函数,解决了预处理宏的问题。
但是在c++出现之后,使用预处理宏会出现两个问题:
第一个在c中也会出现,宏看起来像一个函数调用,但是会有隐藏一些难以发现的错误。
第二个问题是c++特有的,预处理器不允许访问类的成员,也就是说预处理器宏不能用作类类的成员函数。
预处理宏的缺陷
预处理器宏存在问题的关键是我们可能认为预处理器的行为和编译器的行为是一样的。当然也是由于宏函数调用和函数调用在外表看起来是一样的,因为也容易被混淆。
但是其中也会有一些微妙的问题出现:
问题一:
#define ADD(x,y) x+y
inline int Add(int x,int y){
return x + y;
}
void test(){
int ret1 = ADD(10, 20) * 10; //希望的结果是300
int ret2 = Add(10, 20) * 10; //希望结果也是300
cout << "ret1:" << ret1 << endl; //210
cout << "ret2:" << ret2 << endl; //300
}
//可以通过把x+y换成(x+y)解决
问题二:
#define COMPARE(x,y) ((x) < (y) ? (x) : (y))
int Compare(int x,int y){
return x < y ? x : y;
}
void test02(){
int a = 1;
int b = 3;
//cout << "COMPARE(++a, b):" << COMPARE(++a, b) << endl; // 3原因在于预处理替换出两次++a,a变成了3
cout << "Compare(int x,int y):" << Compare(++a, b) << endl; //2++a运行之后作为参数传入函数,不会出现两次替换++a的问题
}
//无法避免
问题三:
预定义宏函数没有作用域概念,无法作为一个类的成员函数,也就是说预定义宏没有办法表示类的范围。//无法避免
为了保持预处理宏的效率又增加安全性,而且还能像一般成员函数那样可以在类里访问自如,c++引入了内联函数(inline function).
内联函数继承课宏函数的效率,没有函数调用时开销,然后又可以像普通函数那样,可以进行参数,返回值类型的安全检查,又可以作为类的成员函数,解决了预处理宏的问题。
阅读全文
0 0
- 预处理宏的问题
- 有关预处理的问题
- 预处理CComModule的问题
- 有关于预处理的问题
- 一个预处理定义的问题
- C语言的预处理问题
- verilog读取文件的预处理问题
- verilog读取文件的预处理问题
- 关于常用编译预处理指令的问题
- 预处理和结构体的问题
- 使用C/C++编译预处理时需要注意的问题(宏相关问题)
- 预处理 宏的小总结
- 预处理宏
- 匹配问题 dp预处理
- 预处理相关问题
- 你可能不知道的编程小问题:预处理、sizeof
- c++ odbc方式连接mysql产生预处理问题的跟踪
- 预处理与宏的巧妙用法
- zoj 3596 BFS+大数简单运算
- JZOJ 1321. 灯
- V2G背景201707051926
- Windows23
- HTML5 WebSocket与消息推送
- 预处理宏的问题
- LeetCode_50_Pow(x, n)
- Swift
- ecliple-tomcat部署maven项目方式之一
- Wiegand 协议
- const优点全面总结
- Java Swing设置主窗口位置居中方法
- Java读取文件
- HTTP协议详解