【发布时间】:2016-01-22 00:03:24
【问题描述】:
Why this program compiles fine in C & not in C++? 的答案解释说,与 C 语言不同,C++ 语言不允许 char 数组的初始值设定项字符串不足以容纳终止空字符。有没有办法在 C++ 中指定一个未终止的 char 数组,而不会使源代码中的字符串膨胀四倍?
例如,在 C 和 C++ 中,以下是等价的:
const char s[] = "Hello from Stack Overflow";
const char s[] = {'H','e','l','l','o',' ','f','r','o','m',' ','S','t','a','c','k',' ','O','v','e','r','f','l','o','w','\0'};
因为字符串 "Hello from Stack Overflow" 的长度为 25,所以它们会产生一个 26 元素的 char 数组,就像写了以下内容一样:
const char s[26] = "Hello from Stack Overflow";
const char s[26] = {'H','e','l','l','o',' ','f','r','o','m',' ','S','t','a','c','k',' ','O','v','e','r','f','l','o','w','\0'};
仅在 C 语言中,程序可以排除终止空字符,例如如果字符串的长度已知带外。 (在 C99 标准的第 6.7.9 章中查找“如果有空间,则包括终止的空字符”。)
const char s[25] = "Hello from Stack Overflow";
const char s[25] = {'H','e','l','l','o',' ','f','r','o','m',' ','S','t','a','c','k',' ','O','v','e','r','f','l','o','w'};
但在 C++ 中,只有第二个有效。如果我知道我将使用 std::strn 系列中的函数而不是 std::str 系列中的函数来操作数据,C++ 语言中是否存在与 C 的简写语法对应的部分?
我的动机与other question about unterminated char arrays in C++ 不同。其动机是游戏中的多个项目名称存储在二维char 数组中。例如:
const char item_names[][16] = {
// most items omitted for brevity
"steel hammer",
{'p','a','l','l','a','d','i','u','m',' ','h','a','m','m','e','r'}
};
如果没有简写来声明未终止的char 数组,则必须逐个字符地写入最大长度名称,这使得它们的可读性和可维护性低于较短的名称。
【问题讨论】:
-
为什么不给你的数组
string? -
@black 您的问题的答案取决于以下问题的答案:在流行的 C++ 实现中,每个
std::string实例有多少恒定开销? -
在“一般”中可以忽略不计。
string_view通常(将会)更轻。 -
何必呢?您通过零填充“钢锤”浪费了三个字节,而在钯上只获得了一个。指向空终止字符串的指针数组会占用更多或更少的空间吗?您打算如何处理通过省略终止符可能节省的少量字节?
-
@AlanStokes 不仅仅是终结者。另外,如果字符串的长度不同,则需要为每个字符串存储一个指针。