以类似于初始化字符串文字的方式初始化char数组

Poo*_*ria 6 c++ arrays string initialization literals

假设我已经跟随char数组的初始化:

char charArray[]={'h','e','l','l','o',' ','w','o','r','l','d'};
Run Code Online (Sandbox Code Playgroud)

我还有一个字符串文字的初始化:

char stringLiteral[]="hello world";
Run Code Online (Sandbox Code Playgroud)

第一个数组和第二个字符串的内容之间的唯一区别是第二个字符串的末尾有一个空字符.

当初始化一个char数组的问题时,是否有一个宏或某些东西允许我们将初始化文本放在两个双引号之间但是数组没有得到额外的空终止字符?

对我来说没有意义的是,当不需要终止空字符时,我们应该使用首先提到的初始化的语法,并为初始化文本中的每个字符写两个单引号,以及用于分隔字符的virgule标记.

我应该补充一点,当我想要一个char数组时,我也不应该明白我不想将它用于依赖于字符串文字的函数以及使用字符串文字结果的所有功能都不是考虑我.

我很感谢你的回答.

Joh*_*itb 7

在C中允许声明数组如下,这将初始化它而不复制终止 '\0'

char c[3] = "foo";
Run Code Online (Sandbox Code Playgroud)

但它在C++中是非法的.我不知道一个允许它用于C++的技巧.C++标准进一步说

基本原理:当这些非终止数组被标准字符串例程操纵时,可能会发生重大灾难.
对原始特征的影响:删除语义明确定义的特征.
转换难度:语义转换.必须将数组声明为一个更大的元素,以包含终止'\ 0'的字符串.
如何广泛使用:很少.这种类型的数组初始化被视为糟糕的编码风格.


Poo*_*ria 0

我可能找到了一种方法来做我想做的事,尽管它不是我想要的,但它可能具有相同的效果。
首先考虑以下两个类:

template <size_t size>
class Cont{
 public:
  char charArray[size];
};
template <size_t size>
class ArrayToUse{
 public:
  Cont<size> container;
  inline ArrayToUse(const Cont<size+1> & input):container(reinterpret_cast<const Cont<size> &>(input)){}
};
Run Code Online (Sandbox Code Playgroud)

在继续之前,您可能需要转到此处查看常量表达式构造函数和初始化类型。
现在看下面的代码:

const Cont<12> container={"hello world"};
ArrayToUse<11> temp(container);
char (&charArray)[11]=temp.container.charArray;
Run Code Online (Sandbox Code Playgroud)

最后,初始化文本写入两个双引号之间。