(转)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类型的数组的指针。

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

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

    先看程序: #include <iostream> using namespace std; int main(int argc, char* argv[]) { char *a = &q ...

  2. 【九度OJ】题目1096-二分查找

    题目1069:查找学生信息 这篇文章中提到的问题主要是由于调试平台Visual Studio和测试平台Online Judge的一些小差异,造成在Visual Studio中调试通过的代码,在输入OJ ...

  3. fscanf_s与scanf_s的宽度参数与缓冲区参数分析

    fscanf_s函数 在文件操作中经常会用到fscanf这个函数,但是在VC和VS中会有警告 意思是编译器觉得fscanf不安全,叫你考虑用一下fscanf_s这个函数来代替fscanf,fscanf ...

  4. sscanf 与 sscanf_s

    sscanf 与 sscanf_s 之间的Details sscanf sscanf函数想必大家用的很熟练吧 sscanf函数原型: sscanf(const char* src,format,... ...

  5. 【C++】sprintf 与sprintf_s

    (转自: http://blog.sina.com.cn/s/blog_4ded4a890100j2nz.html) 将过去的工程用VS2005打开的时候.你有可能会遇到一大堆的警告:warning ...

  6. sizeof _countof _tcslen的比较

    sizeof ----用于计算数组或其他对象的大小,以字节为单位,含\0结束符. _countof----一个宏,用于计算数组的实际元素个数 ,含\0结束符: _tcslen----c++求数组长度的 ...

  7. 读懂_countof,可以懂得什么

    在c++开发中数组是我们经常使用存储结构,而于此同时"数组越界"是每个c++程序员不能不提防陷阱. 还好,我们有预定义宏_countof. 一.在visual c++开发环境下,它 ...

  8. 聊聊 C 语言中的 sizeof 运算

    聊聊 sizeof 运算 在这两次的课上,同学们已经学到了数组了.下面几节课,应该就会学习到指针.这个速度的确是很快的. 对于同学们来说,暂时应该也有些概念理解起来可能会比较的吃力. 先说一个概念叫内 ...

  9. c/c++中关于sizeof、strlen的使用说明

    sizeof: 一般指类型.变量等占用的内存大小(由于在编译时计算,因此sizeof不能用来返回动态分配的内存空间的大小) strlen: c字符串的长度(参数必须是字符型指针 char*,当数组名作 ...

随机推荐

  1. 1129 Recommendation System (25 分)

    Recommendation system predicts the preference that a user would give to an item. Now you are asked t ...

  2. drf序列化器的实例

    应用目录结构: views.py from django.shortcuts import render # Create your views here. from django.views imp ...

  3. 剑指offer——面试题15.2:判断两个整数m和n的二进制中相差多少位

    #include"iostream" using namespace std; int CountDifferentBit(int m,int n) { ,diff=m^n; wh ...

  4. TeamCity 持续集成工具

    https://www.jetbrains.com/teamcity/ null

  5. Rancher2.0 外置存储卷

    一,环境准备 01,基础环境 一台rancher集群 服务器搭建参考原先文章 >>飞机直达 一台nfs服务器 02,nfs服务器搭建 rpm -qa rpcbind|grep rpcbin ...

  6. Beam编程系列之Python SDK Quickstart(官网的推荐步骤)

    不多说,直接上干货! https://beam.apache.org/get-started/quickstart-py/ Beam编程系列之Java SDK Quickstart(官网的推荐步骤)

  7. opensuse install oracle 11gR2 Error in invoking target 'agent nmhs' of makefile '../ins_emagent.mk'

    转自 http://blog.csdn.net/ly5156/article/details/6647563 遭遇Error in invoking target 'agent nmhs' of ma ...

  8. 深入理解JavaScript系列(18):面向对象编程之ECMAScript实现(推荐)

    介绍 本章是关于ECMAScript面向对象实现的第2篇,第1篇我们讨论的是概论和CEMAScript的比较,如果你还没有读第1篇,在进行本章之前,我强烈建议你先读一下第1篇,因为本篇实在太长了(35 ...

  9. 虚拟机中Linux设置当前ip

    1.查看当前IP,查看网卡信息 ifconfig 2.设置临时IP ifconfig eth0 192.168.1.163 netmask 255.255.255.0 eth0表示第一块网卡 设置完之 ...

  10. File 类 的基本操作

    //  File 类(静态类)   File 的缺点:只能用来读小文件 (它是一下子全都读进去) //创建一个文件 // File.Create(@"C:\Users\wbrm\Deskto ...