• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
生活需要积累,积累需要时间,放松心情,慢慢享受
关注.net开发 好好整整Blog,打造好评贴
博客园    首页    新随笔    联系   管理    订阅  订阅

(转)sizeof()和_countof()

 

先看程序:

#include <iostream>

using namespace std;

int main(int argc, char* argv[])

{

    char *a = "abcde";

    char sz1[] = "abc";

    char sz2[] = {"abc"};

    char sz3[] = { 'a', 'b', 'c' };

    printf_s( "%d %d %d %d", _sizeof(a), _countof(sz1), _countof(sz2), _countof(sz3) );

    cout<<endl;

    int b[] = {1,2,3};

    cout<<sizeof(b)<<" "<<_countof(b)<<endl;

    return 0;

}

程序输出:4 4 4 3

                 12    3

***************************************************************************

_countof 是 C++中计算一个固定大小数组长度的宏,比如:

T arr[10];

for( size_t i = 0; i<_countof(arr); --i )   do_something();

对于固定大小数组计算起来非常方便。

/* _countof helper */
#if !defined(_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
#endif

用宏计算的方式容易理解,但是编译期语法检查不够严格。C++中使用了比较严格的语法,确保传入的参数是固定数组。

C++采用type_traits的方式来提取给定数组的信息,通过一个模板函数来完成这个操作:

__countof_helper(UNALIGNED _CountofType (&_Array)[_SizeOfArray]) 函数来提取_Array的信息:

参数为_Array的引用,保证传入参数必须为固定数组,类型为_CountofType, 大小为_SizeofArray.

返回值为: char (*Arr)[_SizeofArray];指向大小为_SizeofArray 的char类型的数组的指针。

posted @ 2009-11-03 11:26  黄超  阅读(2217)  评论(2)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3