Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2349766
  • 博文数量: 527
  • 博客积分: 10343
  • 博客等级: 上将
  • 技术积分: 5565
  • 用 户 组: 普通用户
  • 注册时间: 2005-07-26 23:05
文章分类

全部博文(527)

文章存档

2014年(4)

2012年(13)

2011年(19)

2010年(91)

2009年(136)

2008年(142)

2007年(80)

2006年(29)

2005年(13)

我的朋友

分类: WINDOWS

2009-03-21 12:24:18

微软把 _countof 定义在stdlib.h 中, 但它不是C语言标准库的一部分, 所以gcc或其它的平台可能没有. 不止一次因为 SIZEOF_ARRAY只出现在SDK头文件中, 而在项目中重新定义它.

SIZEOF_ARRAY 是宏.

_countof在C++中, 即是使用了高级的模板技巧实现的, 是类型安全的.
char ca[3];
char *pa;

SIZEOF_ARRAY(ca); 
SIZEOF_ARRAY(pa);
都不会报错, 但对后者往往会得到错误的结果.

_countof可以保证参数一定是个数组类型, 因此更安全, 能在编译期就帮助发现潜在的错误.

在只使用C时, _countof 却仍然只是 SIZEOF_ARRAY宏的一个别名, C没有模板. 不得不如此.

另外, 不管是SIZEOF_ARRAY, 还是_countof, 都有能力处理多维数组中的不同维数:

    int ia[3][5] ;
    printf("sizeof: %d\n", _countof(ia) );
    int ia[3][5] ;
    printf("sizeof: %d\n", _countof(ia[0]) );

没理由使用SIZEOF_ARRAY.

另外, 用模板实现 _countof 对于模板初学者并不简单.

sizeof操作符是编译期计算值的, 所以
int i = 0;
printf("%d\n", sizeof(i++) );
并不会对i有任何副作用, 在这段代码上使用 pc-lint会得到:

    printf("%d", sizeof(argc++) );
CPP_Snippet.cpp(30) : Note 960: Violates MISRA Required Rule 12.3, 'sizeof' used on expression with side effect

阅读(1274) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~