谁能看懂这段代码

风之子赛拉飞尔 2010-07-30 04:31:53
本人7年软件开发经验,今天还真是被这段代码搞晕了(︶︿︶)

是VC的一个宏(_countof)的定义,用于获取静态数组的大小(元素个数)

#if !defined(__cplusplus)
#define _countof(_Array) (sizeof(_Array) / sizeof(_Array[0]))
#else
extern "C++"
{
template <typename _CountofType, size_t _SizeOfArray>
char (*__countof_helper(UNALIGNED _CountofType (&_Array)[_SizeOfArray]))[_SizeOfArray];
#define _countof(_Array) sizeof(*__countof_helper(_Array))
}
#endif


我的理解,__countof_helper 是一个模板函数指针的静态数组,大小为_SizeOfArray。
(_CountofType 和 _SizeOfArray 都是由模板机制自动匹配的)

函数指针的函数原型定义为:char __countof_helper_func(_CountofType (&_Array)[])
这个函数带有一个参数,参数类型是_CountofType型的静态数组 的引用。

于是 *__countof_helper(_Array) 该如何解释?

如果说 __countof_helper 是数组指针,那它如何能带参数?
...全文
8055 125 打赏 收藏 转发到动态 举报
写回复
用AI写文章
125 条回复
切换为时间正序
请发表友善的回复…
发表回复
fcly1981826ly 2010-08-09
  • 打赏
  • 举报
回复
楼主牛?还是你们更牛?
peach_man 2010-08-09
  • 打赏
  • 举报
回复
学习了 呵呵
wofa1648 2010-08-08
  • 打赏
  • 举报
回复
技术贴,很好学习了
cnnol 2010-08-08
  • 打赏
  • 举报
回复
函数的返回值是数组指针
就呆在云上 2010-08-08
  • 打赏
  • 举报
回复
[Quote=引用 133 楼 bluedog 的回复:]
我也写过一个类似的不过应该更清晰

C/C++ code


//--------------------------------------------------------------------------
// 取得某个静态数组的大小
template<typename T,int size>
inline size_t array_size(T(& array)……
[/Quote]


哈哈,这个不是更好么?那么搞一下也不见得好多少哈
BlueDog 2010-08-08
  • 打赏
  • 举报
回复
我也写过一个类似的不过应该更清晰


//--------------------------------------------------------------------------
// 取得某个静态数组的大小
template<typename T,int size>
inline size_t array_size(T(& array)[size])
{
return size; //sizeof(array)/sizeof(array[0]);
}
wzyzb 2010-08-07
  • 打赏
  • 举报
回复
很好 不错 very good
micheal_xu 2010-08-07
  • 打赏
  • 举报
回复
学习了~~~
ryanjfdeng 2010-08-07
  • 打赏
  • 举报
回复
看完《C++ Templates: The Complete Guide》就可以看明白这段代码,仔细看完《C++ Templates: The Complete Guide》和《design patterns》才应该去看《modern c++ design》.《modern c++ design》比stl的源码要难看,实用性其实不高。
cxyOOOO 2010-08-07
  • 打赏
  • 举报
回复
c的宏没有类型检查,碰到char *p;(或其它类型指针) _countof(p);会得到错误结果。
cpp利用实参推导,返回char(*)[xxx]类型指针,xxx是推导出的,然后sizeof(char[xxx])。
两者的效率是一样的,都是常数。
tonyzjg 2010-08-07
  • 打赏
  • 举报
回复
学习了
就呆在云上 2010-08-07
  • 打赏
  • 举报
回复
关键就在引用上面了
天外来客-007 2010-08-07
  • 打赏
  • 举报
回复
没有看懂! 呵呵!
ronilee 2010-08-07
  • 打赏
  • 举报
回复
我觉得57楼的代码也不会对运行期的代码产生影响啊,他用了inline,编译完的代码里那里就应该直接是一个常数了。其实定义一个宏表示数组长度不就好了,为什么还要搞这么复杂。
gglisa3 2010-08-06
  • 打赏
  • 举报
回复
问题在于get不用赋值就可以用了!!!!!!!!!!!

怎么创建返回“数组”的函数?????????????
??????????????
??????????????????????????
gglisa3 2010-08-06
  • 打赏
  • 举报
回复
char(* get())[3];//get是个函数指针

cout<<endl<<sizeof(*get())<<endl; //Output 3 !!!!!!!

//模板技术
template<typename T, size_t _size>
inline size_t GetLength(T (&a)[_size])
{
return _size;
}

两者相结合就OK了!!!!!



shell2522 2010-08-05
  • 打赏
  • 举报
回复
用户使用_countof(_Array)时,等效与sizeof(*_countof_helper(_Array)),因_countof_helper函数返回char(*p)[_SizeOfArray],其中p为返回的指针,而_SizeOfArray即为欲求的_Array数组元素个数,带入_countof_helper函数返回的指针p,得sizeof(*p),p为指向数组的指针,则sizeof(*p)=sizeof(*(char(*p)[_SizeOfArray])),(记住!此p为指向含有_SizeOfArray个char型元素的数组的指针,我们不妨设此数组为char str[_SizeOfArray]),这样我们得到sizeof(str)=_SizeOfArray*sizeof(char),实为_SizeOfArray,劳烦各位大虾给鉴定一下
onemonth 2010-08-05
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 windsonzhl 的回复:]

引用 6 楼 taodm 的回复:
楼主还是找本《modern c++ design》去多震撼震撼吧。
这已经是最基本级的编程技巧了。


侯捷翻译的那个?早看过了,还写了篇文章。你不妨去我的博客逛逛:)
[/Quote]
那你还让这个搞晕?难道你写的文章内容就是我买了一本mcd?mcd不是用来做枕头的。
T0Ols 2010-08-05
  • 打赏
  • 举报
回复
就这么七年的啊? 你咋七年的 告诉告诉我
加载更多回复(105)

64,685

社区成员

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

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