c中的错误,但不是c ++中的错误

时间:2010-06-17 11:48:38

标签: c++ c compiler-errors

const int t=5;
char buf[t+5];

当我编译时,这会在C中产生错误而在C ++中不会产生错误!!
有人可以解释一下原因吗?

注意:我知道const默认为'C ++'中的内部链接,其中'C'默认为外部链接。它与上述情况有什么关系吗?

6 个答案:

答案 0 :(得分:9)

这在C89 C中无效,但在C99中可能有效

请参阅this stack overflow question

答案 1 :(得分:4)

我认为这是因为编译器无法将t+5计算为常量表达式。它看起来应该没问题,但是:

  

关于数组声明的一个重要观点是它们不允许使用不同的下标。给定的数字必须是常量表达式,可以在编译时评估,而不是运行时。

Source

答案 2 :(得分:4)

正如其他人所解释的那样,C保持比C ++更简单,并且不允许const变量出现在整数常量表达式中。但是在C89和C ++中,声明的数组必须具有编译时常量。

您可以使用此

的枚举
enum {
  BufSize = 5
};

char buf[BufSize + 5];

它与内部链接无关 - 外部链接变量在C ++中的整数常量表达式中同样可行。 C ++中的内部链接是允许它们出现在常量表达式中的结果,而不是必然性。 C ++标准解释了为什么它们默认具有内部链接

  

因为const对象可以在C ++中用作编译时值,所以这个特性促使程序员为每个const提供显式的初始化值。此功能允许用户将const对象放在许多编译单元中包含的头文件中

答案 3 :(得分:3)

在C中,数组的大小必须是常量表达式。 Const Int在C中不是常量表达式。它的含义更像是“只读”。请改用#define t 5。

答案 4 :(得分:1)

是的,这与C的外部链接有关。

您已声明外部链接的整数t。如果将此文件与另一个定义t的文件链接,则必须在文件的编译时间之后确定缓冲区的大小,这在C中当然是不可能的。

答案 5 :(得分:1)

这里有两个问题,动态大小的数组和consts。 const的概念在C和C ++中是不同的。对于C,它只是一个您无权更改的变量,因此不是C语言的有效维度,只允许具有编译时固定维度的数组。 在C中定义`编译时常量'的唯一方法是使用枚举类型

enum dummy { t=5 };

所以这样的事情适用于C89。

与此相反,您的代码也应该在C99中工作。在那里,阵列将在语法上被识别为具有动态大小。那么任何体面的优化器都应该能够优化它。 但要注意这一点 sizeof(buf) 将是C ++中数组(10)的总大小,而对于c99,它将是sizeof(char*)