【问题标题】:variably modified 'stack' at file scope [duplicate]在文件范围内可变地修改“堆栈”[重复]
【发布时间】:2019-11-16 15:39:25
【问题描述】:
int const a=9;
int stack[a];
int main()
{
    return 0;
}

上面的代码给出了一个错误:在文件范围内可变地修改了'stack'

但是当我将代码更改为:

#define b 3
int stack[b];
int main()
{
    return 0;
}

它编译没有错误。虽然#define 和 const 变量都用于定义常量标识符,但为什么当我使用 const var 而不是 #define 时会出现错误。我搜索了类似的问题,但他们都给出了关于错误,但没有理由。

搜索了const和#define,发现有时gcc编译器将const识别为只读但太混乱了。

【问题讨论】:

  • 静态数组的数组维度必须是在编译时解析的整数常量表达式。它很好地定义了什么是整数常量表达式,什么不是整数常量表达式。尤其是,value const int 的计算不允许在整数常量表达式中。
  • 什么是整数常量表达式,整数和整数常量表达式有什么区别
  • 来自 C 2011 标准,6.6,常量表达式:“整数常量表达式应具有整数类型,并且只能具有整数常量、枚举常量、字符常量、sizeof 表达式的操作数,其结果是整数常量、_Alignof 表达式和作为强制类型转换的直接操作数的浮点常量。整数常量表达式中的强制转换运算符只能将算术类型转换为整数类型,除非作为 sizeof 或 _Alignof 运算符的操作数的一部分。”

标签: c dsa


【解决方案1】:

在 C 语言中,静态存储变量的大小可以由常量表达式定义。使用变量(即使是常量)作为大小不是这样的表达式。

错误是 100% 正确的。

第二种情况:处理器将b文本替换为常量表达式3

常量表达式是在编译期间评估的东西。变量值只能在运行时评估。

【讨论】:

    猜你喜欢
    • 2014-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-15
    • 2017-08-05
    相关资源
    最近更新 更多