为什么这个程序在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数组,那么必须逐个字符地写入最大长度的名称,这使得它们比较短的名称更不易读,更难维护.
有可能,但我同意艾伦·斯托克斯的“为什么”
例如使用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)
但从长远来看,这可能会给你带来更多麻烦......
| 归档时间: |
|
| 查看次数: |
689 次 |
| 最近记录: |