gpt4 book ai didi

c++ - 哪些语言标准允许忽略固定大小数组上的空终止符?

转载 作者:IT老高 更新时间:2023-10-28 21:47:26 24 4
gpt4 key购买 nike

我们正在将 C 代码转换为 C++。
我注意到以下代码在 C 中定义良好,

int main(){

//length is valid. '\0' is ignored
char str[3]="abc";
}

正如 Array initialization 中所述那个:

"If the size of the array is known, it may be one less than the size of the string literal, in which case the terminating null character is ignored."

但是,如果我要在 C++ 中构建相同的代码,我会收到以下 C++ 错误:

error: initializer-string for array of chars is too long
[-fpermissive] char str[3]="abc";

我希望有人能解释一下。

问题:
代码示例在所有 C 语言标准中都有效吗?
是不是在所有 C++ 语言标准中都无效?
是否存在在一种语言中有效但在另一种语言中无效的原因?

最佳答案

您在这里看到的是 C 和 C++ 中 cstring 初始化规则的不同。在 C11 §6.7.9/14 我们有

An array of character type may be initialized by a character string literal or UTF−8 string literal, optionally enclosed in braces. Successive bytes of the string literal (including the terminating null character if there is room or if the array is of unknown size) initialize the elements of the array.

强调我的

只要数组对于不包括空终止符的字符串足够大,它就有效。所以

char  str[3]="abc";

是有效的 C。在 C++14 中,但在 [dcl.init.string]/2 状态中找到的管理此规则的规则

There shall not be more initializers than there are array elements.

接着显示下面的代码是错误的

char cv[4] = "asdf"; // error

因此,在 C++ 中,您必须为包括空终止符在内的整个字符串文字提供足够的存储空间。

关于c++ - 哪些语言标准允许忽略固定大小数组上的空终止符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37861600/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com