先看程序:

#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[] = {,,};

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

    return ;

}

程序输出:   

//***************************************************************************//

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

T arr[];

for( size_t i = ; 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类型的数组的指针。

(转)sizeof()和_countof()区别的更多相关文章

  1. (转)sizeof()和_countof()

    (转)sizeof()和_countof()   先看程序: #include <iostream> using namespace std; int main(int argc, cha ...

  2. sizeof && strlen 的区别

    本文主要记录了 sizeof 操作符 和 strlen() 函数的区别,以及各自的用途.(在下才疏学浅,发现错误,还请留言指正) sizeof 和 strlen 的区别 示例代码如下: #includ ...

  3. sizeof 和 strlen 区别

    Sizeof与Strlen的区别与联系 一.sizeof    sizeof(...)是运算符,在头文件中typedef为unsigned int,其值在编译时即计算好了,参数可以是数组.指针.类型. ...

  4. strlen与sizeof有什么区别?

    其实二者的区别还是很大的,首先strlen计算的长度不包括字符串最后的终止null字节, 而sizeof则计算包括终止null的缓冲区长度.还有一点很容易被忽略,strlen需要一次函数调用, 即它是 ...

  5. sizeof和strlen()区别及用法

    //sizeof是以字节为单位计算变量或类型所占内存大小,它是属于C语言运算符系列:而strlen()是一个函数,是计算字符串长度(也是以字节为单位,但略有区别):比如: char array[] = ...

  6. sizeof和strlen区别(转)

    char str[20]="0123456789"; int   a=strlen(str); /*a=10;strlen 计算字符串的长度,以\0'为字符串结束标记. int   ...

  7. sizeof和strlen()区别

    sizeof关键字和strlen()标准函数都可以用来测试字符串的长度,但是两者有很大的不同 sizeof只能在本函数内, 使用""和不指定长度的字符数组中才能测出字符串的真实长度 ...

  8. sizeof和strlen区别

    sizeof(...)是运算符,在头文件中typedef为unsigned int,其值在编译时即计算好了,参数可以是数组.指针.类型.对象.函数等 数组:编译时分配的空间大小 指针:指针所占的空间, ...

  9. strlen sizeof strcat strcpy区别

      strlen(p): 能计算出p指向字符串的长度(以当前p的位置开始),不包含终止字符'\0': p可以声明为char* p或者char p[],这两种形式strlen均能正确计算. sizeof ...

随机推荐

  1. Python爬虫入门教程 51-100 Python3爬虫通过m3u8文件下载ts视频-Python爬虫6操作

    什么是m3u8文件 M3U8文件是指UTF-8编码格式的M3U文件. M3U文件是记录了一个索引纯文本文件, 打开它时播放软件并不是播放它,而是根据它的索引找到对应的音视频文件的网络地址进行在线播放. ...

  2. asp.Net Core免费开源分布式异常日志收集框架Exceptionless安装配置以及简单使用图文教程

    最近在学习张善友老师的NanoFabric 框架的时了解到Exceptionless : https://exceptionless.com/ !因此学习了一下这个开源框架!下面对Exceptionl ...

  3. vimium使用

    vimium使用 chrome下面的vimium插件已经慕名已久,迟迟没有做尝试,今天在家有空就熟悉了一下vimium,感觉还是棒棒的.记录一下一些使用心得. 常用按钮 j 向上滚动 k 向下滚动 d ...

  4. 【Python3爬虫】为什么你的博客没人看呢?

    我相信对于很多爱好和习惯写博客的人来说,如果自己的博客有很多人阅读和评论的话,自己会非常开心,但是你发现自己用心写的博客却没什么人看,多多少少会觉得有些伤心吧?我们今天就来看一下为什么你的博客没人看呢 ...

  5. Kubernetes知识小普及

    大部分概念Kubernetes官网都有详细介绍,Kubernetes中文官网 https://kubernetes.io/zh/docs/tutorials/kubernetes-basics/ 官网 ...

  6. 微信小程序开发05-日历组件的实现

    接上文:微信小程序开发04-打造自己的UI库 github地址:https://github.com/yexiaochai/wxdemo 我们这里继续实现我们的日历组件,这个日历组件稍微有点特殊,算是 ...

  7. Cortex-M 实现互斥操作的三种方法

    注:本文仅针对Cortex-M3/4 系列进行讲述. 在传统的ARM处理器架构中,常使用SWP指令来实现锁的读/写原子操作,但从ARM v6开始,读/写访问在独立的两条总线上进行,SWP指令已无法在此 ...

  8. SLAM+语音机器人DIY系列:(四)差分底盘设计——3.底盘通信协议

    摘要 运动底盘是移动机器人的重要组成部分,不像激光雷达.IMU.麦克风.音响.摄像头这些通用部件可以直接买到,很难买到通用的底盘.一方面是因为底盘的尺寸结构和参数是要与具体机器人匹配的:另一方面是因为 ...

  9. 如何探测网络设备ACL规则

    探测网络设备ACL规则 背景:在互联网企业的生产网络中,往往在网络入口处的网络设备上会有成千上万条ACL策略,这么多的ACL导致了网络管理员很难彻底梳理清楚其中的逻辑关系,从而不知道到底对外开放了哪些 ...

  10. C# 连接/查询Jira

    查询jira数据,如果是前端,可以按照如下格式直接访问,获取数据 http://jira.company.com/rest/api/2/search?jql=project = REM AND res ...