C语言中的简单错误

时间:2011-03-05 14:17:45

标签: c arrays const

const int size = 10; // realna ilość danych
int tablica[size+1];
我有: 在任何函数之外声明的可变大小类型

4 个答案:

答案 0 :(得分:4)

使用

#define size 10

而不是const int。后者不是C中的编译时常量,而是一个无法赋值的变量(除非通过指针和强制转换来摆脱const)。

(这是C和C ++之间的区别。)

答案 1 :(得分:3)

你可以使用枚举。

enum
{
    size = 10
};

int table[size + 1];

答案 2 :(得分:3)

使用:

enum { size = 10 };

这是一个常量值,可用于声明和标签等情况。在C99中,在函数内部,原始代码不会成为问题 - 您的数组tablica将是VLA或可变长度数组(并且编译器错误消息试图说“您不能拥有VLA外的一个功能“)。

在代码上使用调试器时,使用枚举可以提供更好的可跟踪性;符号包含在符号表中。通常,调试器无法使用C预处理器符号,因此在#define'd时尝试打印'size'不会打印答案;当它是枚举时打印“大小”。

另请参阅:"static const" vs "#define" in C

答案 3 :(得分:1)

错误是相当不言自明的。您不能在函数外声明可变长度数组。虽然您正在创建的数组的大小实际上是在编译时修复的,但您在技术上仍然违反了该语言的约束。

通常的选择是:

  1. 将数组移动到一个函数中。 (通常是最好的选择,记住在可能的情况下应避免使用全局变量。)

  2. #define size n其中n是您想要的大小,而不是使用int。 (通常比“神奇的数字”更好,而且在传统的C中也很标准。)

  3. 使用“幻数”(int tablica[11];)。 (通常是最后的选择,但有时它确实更有意义。)