指针不应与字符串常量直接比较
10.5.3 ID_illPtrStrComparison
直接比较指针和字符串常量的结果往往总是 false,应改用字符串比较函数。
示例:
bool is_name(const char* p) {
return p == "bar"; // Non-compliant
}
如果例中 is_name 函数只接受常量字符串作为参数,该函数在某些环境中也可能正常工作,如:
if (is_name("foo")) { // May be false
....
}
if (is_name("bar")) { // May be true
....
}
然而相同的字符串常量是否一定拥有相同的地址呢?对这个问题不同的编译器有不同的实现,有可移植性要求的代码要规避这种问题,而且这种问题极易导致错误,一般的程序都应该避免这种问题。
应改为:
bool is_name(const char* p) {
return !strcmp(p, "bar"); // Compliant
}
依据
ISO/IEC 9899:1999 6.4.5(6)-unspecified
ISO/IEC 9899:2011 6.4.5(7)-unspecified
ISO/IEC 14882:2003 2.13.4(2)-implementation
ISO/IEC 14882:2011 2.14.5(12)-implementation
ISO/IEC 14882:2017 5.13.5(16)-unspecified