const int t=5;
char buf[t+5];
当我编译时,这会在C中产生错误而在C ++中不会产生错误!!
有人可以解释一下原因吗?
注意:我知道const默认为'C ++'中的内部链接,其中'C'默认为外部链接。它与上述情况有什么关系吗?
答案 0 :(得分:9)
这在C89 C中无效,但在C99中可能有效
答案 1 :(得分:4)
我认为这是因为编译器无法将t+5
计算为常量表达式。它看起来应该没问题,但是:
关于数组声明的一个重要观点是它们不允许使用不同的下标。给定的数字必须是常量表达式,可以在编译时评估,而不是运行时。
答案 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*)