宏和模板差异举例

本文探讨了C++中宏定义与模板定义之间的冲突问题,分析了两者的工作原理及出现冲突的原因,并给出了相应的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include   <iostream.h>
#define   max(a,b)   ((a)   >   (b)   ?   (a)   :   (b))
using namespace std;
template <class   T>
T   max(T   a,   T   b){
        return   a   >   b   ?   a:b   ;
};

void   main(){
        int   a   =   1;
        int   b   =   2;
        max(a,b);   //想调用宏
        max(a,b);   //想调用T
}

 

本段代码都有什问题?

1. 模板template<class T>T max(T a, T b)  在标准库里面已经有定义了,不能再重新定义应用。

2. 不过C++模板有一个特殊的机制:模板中的代码只有在用到时才会被实例化。也就是说,当遇到template<class T> T max(T a, T b) 时,编译器并不会完全展开整个模板类。只有当访问了模板上的T max(T a, T b)函数时,才会将成员函数的代码展开作语义检查,此时编译会报错。

3.宏和模板的功能实现是在不同的时期进行的,宏在编译前就对max(a,b)做了字符串替换工作,所以在后面对模板进行词发分析时会产生错误,导致编译都不能通过,这里只将宏和模板定义的函数不重名就会解决本问题了!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值