定义没有终止符的C++ char数组

Dam*_*ick 6 c++ arrays string

为什么这个程序在C++中编译好而不是在C++中的答案解释说,与C语言不同,C++语言不允许char数组的初始化字符串不足以容纳终止空字符.有没有办法char在C++中指定一个未终止的数组,而不会在源代码中将字符串膨胀四倍?

例如,在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'};
Run Code Online (Sandbox Code Playgroud)

因为字符串的"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'};
Run Code Online (Sandbox Code Playgroud)

仅在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'};
Run Code Online (Sandbox Code Playgroud)

但在C++中,只有第二个是有效的.如果我知道我将使用系列中的函数来操作数据std::strn,而不是std::str系列函数,那么C++语言中是否有与C的简写语法相对应的?

我的动机与C++中未终止char数组其他问题不同.激发这一点的是游戏中的几个项目名称存储在二维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'}
};
Run Code Online (Sandbox Code Playgroud)

如果没有简写来声明未终止的char数组,那么必须逐个字符地写入最大长度的名称,这使得它们比较短的名称更不易读,更难维护.

Vla*_*irS 0

有可能,但我同意艾伦·斯托克斯的“为什么”

例如使用C++:宏可以将“abc”扩展为“a”、“b”、“c”吗? 可以对其进行调整,以允许对任何提供的数组进行操作并将其限制为长度 16。

#include <boost/preprocessor/repetition/repeat.hpp>
#include <boost/preprocessor/punctuation/comma_if.hpp>

template <unsigned int N>
constexpr char get_ch (char const (&s) [N], unsigned int i)
{
    return i >= N ? '\0' : s[i];
}

#define STRING_TO_CHARS_EXTRACT(z, n, data) \
    BOOST_PP_COMMA_IF(n) get_ch(data, n)

#define STRING_TO_CHARS(STRLEN, STR)  \
    BOOST_PP_REPEAT(STRLEN, STRING_TO_CHARS_EXTRACT, STR)


const char item_names[][16] = { // most items omitted for brevity
    "steel hammer",
    STRING_TO_CHARS(16, "palladium hammer"),
    //{'p','a','l','l','a','d','i','u','m',' ','h','a','m','m','e','r'},
};
Run Code Online (Sandbox Code Playgroud)

但从长远来看,这可能会给你带来更多麻烦......