微软把 _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) |