sizeof 表达式的结果不应与 0 或负数比较
10.7.6 ID_sizeof_zeroComparison
将 sizeof 表达式的结果与 0 或负数比较往往意味着逻辑错误。
标准规定,如果 sizeof 作用于完整类型结果一定大于 0,如果作用于不完整的类型则无法通过编译。
示例:
void foo(int* p) {
if (sizeof(p)) { // Non-compliant, always true
....
}
}
注意,在某些 C 环境中,sizeof 作用于空结构体或联合体结果可能是 0,但这属于未定义的行为,如:
struct A {} a;
printf("%zu\n", sizeof(a)); // What is output?
空结构体或联合体在 C 标准中属于非法类型,示例代码可能会输出 0,也可能不会通过编译。
依据
ISO/IEC 9899:1999 6.7.2.1(7)-undefined
ISO/IEC 9899:2011 6.7.2.1(8)-undefined
ISO/IEC 14882:2003 5.3.3(1 6)
ISO/IEC 14882:2003 9(3)
ISO/IEC 14882:2011 5.3.3(1 6)
ISO/IEC 14882:2011 9(3)
ISO/IEC 14882:2017 8.3.3(1 6)
ISO/IEC 14882:2017 12(4)