【发布时间】:2010-06-17 11:48:38
【问题描述】:
const int t=5;
char buf[t+5];
当我编译时,这会在 C 中出现错误,但在 C++ 中不会出现!!
谁能解释一下原因?
注意:我知道 const 在“C++”中默认为内部链接,而在“C”中它默认为外部链接。和上面的案例有关系吗??
【问题讨论】:
标签: c++ c compiler-errors
const int t=5;
char buf[t+5];
当我编译时,这会在 C 中出现错误,但在 C++ 中不会出现!!
谁能解释一下原因?
注意:我知道 const 在“C++”中默认为内部链接,而在“C”中它默认为外部链接。和上面的案例有关系吗??
【问题讨论】:
标签: c++ c compiler-errors
这在 C89 C 中无效,但在 C99 中可能有效
【讨论】:
正如其他人所解释的,C 比 C++ 更简单,并且不允许 const 变量出现在整数常量表达式中。但是在 C89 和 C++ 中声明的数组都必须具有编译时常量大小。
您可以为此使用枚举
enum {
BufSize = 5
};
char buf[BufSize + 5];
它与内部链接无关 - 外部链接变量在 C++ 的整数常量表达式中同样可行。 C++ 中的内部链接是允许它们出现在常量表达式中的结果,但不是必需的。 C++ 标准解释了为什么它们默认具有内部链接
因为 const 对象可以在 C++ 中用作编译时值,所以这个特性促使程序员为每个 const 提供显式的初始化值。此功能允许用户将 const 对象放在许多编译单元中包含的头文件中
【讨论】:
我认为这是因为编译器无法将 t+5 评估为常量表达式。看起来应该没问题,但是:
关于数组声明的一个重要点是它们不允许使用不同的下标。给定的数字必须是可以在编译时计算的常量表达式,而不是运行时。
【讨论】:
在 C 中,数组的大小必须是常量表达式。 Const Int 在 C 中不是常量表达式。它的含义更像是“只读”。请改用#define t 5。
【讨论】:
是的,这与 C 对 t 的外部链接有关。
您已经声明了一个外部链接的整数 t。如果将此文件与另一个定义 t 的文件链接,那么缓冲区的大小必须在文件的编译时间之后确定,这在 C 语言中当然是不可能的。
【讨论】:
extern const int t = 5; char buf[t + 5]; 在 C++ 中同样适用。
这里有两个问题,动态大小的数组和常量。 const 的概念在 C 和 C++ 中是不同的。对于 C,它只是一个您无权更改的变量,因此对于仅允许具有编译时间固定维度的数组的 C 方言来说,它不是一个有效维度。 在 C 中定义“编译时间常数”的唯一方法是使用枚举类型
枚举虚拟 { t=5 };所以这样的事情适用于 C89。
与此相反,您的代码也应该在 C99 中工作。在那里,数组将在语法上被识别为动态大小。那么任何体面的优化器都应该能够优化它。 但也要注意
sizeof(buf)
将是 C++ 中数组 (10) 的总大小,而对于 c99,它将是 sizeof(char*)
【讨论】:
sizeof(buf) 将在运行时进行评估并产生 10。 :)