这里学术气愤浓厚,问一下__DEFINE_CPP_OVERLOAD_SECURE_FUNC_0_1这个宏的问题

rickerliang 2009-04-15 05:44:56
这类宏是通过模板推导来实现简化代码编写的(vc8的crtdef.h头文件),例如
一个strcpy要传入缓冲区的长度,无论缓冲区是一个指针还是数组,于编译器来说,如果参数是数组,那么就可以推导出数组的大小从而得到缓冲区的长度,使得在调用函数时不会传入错误的长度而导致缓冲区溢出。宏的代码如下:

#define __DEFINE_CPP_OVERLOAD_SECURE_FUNC_0_1(_ReturnType, _FuncName, _DstType, _Dst, _TType1, _TArg1) \
extern "C++" \
{ \
template <size_t _Size> \
inline \
_ReturnType __CRTDECL _FuncName(_DstType (&_Dst)[_Size], _TType1 _TArg1) \
{ \
return _FuncName(_Dst, _Size, _TArg1); \
} \
}


我的问题是,_DstType (&_Dst)[_Size]这里为什么要有一个&的操作符,我试过,把&去掉,编译器就报无法推导模板错误,请指教,谢谢
...全文
745 16 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
hityct1 2009-04-16
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 rickerliang 的回复:]
我的问题是为什么要用引用,为什么不用引用就无法推导
[/Quote]
因为数组作为参数传入函数时,会退化为指针,_Size信息被舍弃了。所以数组作参数时根本不必写size。
如:
void fun(int a[4], ...)和void fun(int a[], ...)是一样的。

(_DstType (&_Dst)[_Size]

_Dst是个引用,必须将一个大小为_Size、类型为_DstType的数组赋给它。而且_Size信息被保留。

看这个例子:

#include <iostream>
using namespace std;

template<int size>
void fun(int a[size], int (&b)[size])
{
cout<<sizeof(a)<<endl;
cout<<sizeof(b)<<endl;
}

int main()
{
int a[3],b[3];
fun<3>(a,b);
return 0;
}

rickerliang 2009-04-15
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 oyljerry 的回复:]
数组作为参数,需要用引用,不能直接用(_Dst)[_Size ]作为参数...
[/Quote]

正解。数组形参用引用,这样才能保证不被编译器退化成指针,才能保证数组形参的整体性,只要数组未被退化分割,编译器就能推导出数组的长度。高手。
rickerliang 2009-04-15
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 oyljerry 的回复:]
数组作为参数,需要用引用,不能直接用(_Dst)[_Size ]作为参数...
[/Quote]

正解,数组只要用引用作为函数的形参,才不会被编译器退化成指针,才能保证数组形参是一个整体,这样,编译器才能通过这个未被分割的形参推导出数组的长度。高手。
wxgiter 2009-04-15
  • 打赏
  • 举报
回复
顶下~~
xuruichen 2009-04-15
  • 打赏
  • 举报
回复
顶下,感觉二楼正解
Proteas 2009-04-15
  • 打赏
  • 举报
回复
不懂,还没开始学习模板。
oyljerry 2009-04-15
  • 打赏
  • 举报
回复
数组作为参数,需要用引用,不能直接用(_Dst)[_Size ]作为参数...
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 rickerliang 的回复:]
我的问题是为什么要用引用,为什么不用引用就无法推导
[/Quote]如果不用&的操作符,就会访问越界~~
surge0321 2009-04-15
  • 打赏
  • 举报
回复
学习
fairchild811 2009-04-15
  • 打赏
  • 举报
回复
不懂,哪位把这个例子内的代码具体解释一下,谢谢
liliangbao 2009-04-15
  • 打赏
  • 举报
回复
数组的引用,也可以用指针代替~
[Quote=引用 5 楼 rickerliang 的回复:]
我的问题是为什么要用引用,为什么不用引用就无法推导
[/Quote]
是函数参数规定了~
rickerliang 2009-04-15
  • 打赏
  • 举报
回复
我的问题是为什么要用引用,为什么不用引用就无法推导
  • 打赏
  • 举报
回复
,_DstType (&_Dst)[_Size

这就是引用啊,不过是数组引用而已.
sherrik 2009-04-15
  • 打赏
  • 举报
回复
mark
  • 打赏
  • 举报
回复
这样使用的
int main()
{
int x[3]={1,2,3};
int(&y)[3] = x;

printf("%d %d %d",y[0],y[1],y[2]);
return 0;
}
  • 打赏
  • 举报
回复
数组的引用形式.

65,187

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧