gpt4 book ai didi

c++ - 为什么 "initializer-string for array of chars is too long"在 C 中编译良好而不在 C++ 中编译?

转载 作者:可可西里 更新时间:2023-11-01 18:40:15 40 4
gpt4 key购买 nike

以下程序在 C 中编译正常但有警告,但在 C++ 中编译失败。为什么?这是什么原因?

#include <stdio.h>
int main(void)
{
char a[5]="Hello";
a[0]='y';
puts(a);
for(int i=0;i<5;i++)
printf("%c",a[i]);
return 0;
}

警告:

Warning:[Error] initializer-string for array of chars is too long [-fpermissive] enabled by default

但如果程序被编译为 C++ 程序,则 C++ 编译器会给出以下错误:

[Error] initializer-string for array of chars is too long [-fpermissive]

我正在使用 GCC 4.8.1 编译器。

最佳答案

简短回答:因为 C 和 C++ 是具有不同规则的不同语言。

长答案:在这两种情况下,原因是数组对于字符串文字来说太小了。字面量由五个可见字符组成,末尾有一个零终止符,因此总大小为 6。

在 C 语言中,您可以使用太长的字符串来初始化数组;多余的字符将被忽略:

C99 6.7.8/14: An array of character type may be initialized by a character string literal, optionally enclosed in braces. Successive characters of the character 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.

编译器会很有帮助地警告字符串过大,因为它几乎肯定表示错误;但它不能拒绝代码,除非您告诉它把警告当作错误处理。

在 C++ 中,初始化器不允许大于数组:

C++11 8.5.2/2: There shall not be more initializers than there are array elements.

因此,对于该语言,编译器应该给出错误。

在这两种语言中,当您希望字符数组的大小适合字符串文字初始化程序时,您可以忽略大小,编译器会做正确的事情。

char a[] = "hello";  // size deduced to be 6

关于c++ - 为什么 "initializer-string for array of chars is too long"在 C 中编译良好而不在 C++ 中编译?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28433862/

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