CppCoreGuidelines SL.str.3 用 zstring 或 czstring 访问 C 风格,空字符结尾的字符串序列
21 December 2023
“Use zstring
or czstring
to refer to a C-style, zero-terminated,
sequence of characters”
理由
可读性更好。表达了程序意图。一个普通的 char*
可以标识指向单独字符的指针,指向字符数组的指针,或者指向控制符结束的 C 风格字符串,甚至是一个小整数。把这些区分开来,可以避免理解错误,减少 bug。
例子
void f1(const char* s); // s is probably a string
我们只知道这里 s
可能是个 nullptr
或者指向至少一个字符的东西。
void f1(zstring s); // s is a C-style string or the nullptr void f1(czstring s); // s is a C-style string constant or the nullptr void f1(std::byte* s); // s is a pointer to a byte (C++17)
注意
不要把 C 风格字符串转换成 string
,除非有特定的理由。
注意
跟其他任何普通指针一样, zstring
不表达所有权。
注意
世界上有成百上千万的 C++ 代码,用到了 char*
和 const char*
,而且还没有文档注释说明。这些类型以很多不同的方式使用。比如有表达所有权的,有指向内存的泛型指针(本该是 void*
)。这就导致我们很难区分他们的使用意图,所以,这条指南也很难遵循。这是 C 和 C++ 中很重要的 bug 来源。所以,尽可能地遵循本规则。
强化
- 标记在
char*
上使用[]
的情况 - 标记对
char*
使用delete
的情况 - 标记对
char*
进行free()
的情况