在书"编程实践中由Brian W. Kernighan,Rob Pike",第21页,专家和#34;定义数字作为常数,而不是宏",他说& #34; C也有const值,但它们不能用作数组边界,因此enum语句仍然是C中的首选方法。
但它与我的做法相冲突:
#include <stdio.h>
int main(void)
{
const int bound = 5;
int array[bound];
return (0);
}
它可以通过编译。
答案 0 :(得分:4)
C也有const值,但它们不能用作数组边界
虽然对于K&amp; RC和ANSI C这个陈述是正确的,但C99标准引入了可变长度数组,使得声明有效(并且它们关于数组声明中const
的可用性的声明无效)。
使用符合C99的编译器,您可以使用任何整数类型的表达式,甚至不是const表达式来声明数组的大小:
int n;
scanf("%d", &n);
if (n <= 0) {
printf("Invalid array size.\n");
return -1;
}
int array[n]; // <<== This is allowed in C99
注意:您的示例使用旧的C规则,没有显式类型声明的变量被视为int
。 bound
的现代(如#&; 34;过去的二十多年&#34;)声明应如下所示:
const int bound = 5;
// ^^^
答案 1 :(得分:2)
const
个变量实际上并不是常数。这就是在C99之前你不被允许做的原因
const int bound = 5;
int array[bound];
C99引入了可变长度数组,允许上述声明。
答案 2 :(得分:1)
您正在使用C99。
ISO C99允许使用可变长度自动数组,并且作为 扩展GCC在C90模式和C ++中接受它们。这些数组是 声明像任何其他自动数组,但长度是 不是一个恒定的表达。存储分配在 当块范围包含时,声明和释放 声明退出。
float read_and_process(int n)
{
float vals[n];
for (int i = 0; i < n; i++)
vals[i] = read_val();
return process(vals, n);
}