c也有const值但它们不能用作数组边界?

时间:2015-01-05 01:37:24

标签: c

在书"编程实践中由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);
    }

它可以通过编译。

3 个答案:

答案 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规则,没有显式类型声明的变量被视为intbound的现代(如#&; 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);
}