gpt4 book ai didi

c - 为什么我们甚至不允许在 switch-case 中使用全局 const 限定变量?IBM 支持门户提示我们可以

转载 作者:行者123 更新时间:2023-12-02 08:40:54 25 4
gpt4 key购买 nike

哈,它变得如此困惑。下面的 IBM 支持门户网站链接似乎表明我们不能将 const 限定变量用作 real 常量的原因是因为它们的生命-time 和程序本身的不一样。好像说只有关于局部变量和全局变量一样,和程序的生命周期是一样的。 ( IBMLINK )。下面是它的确切内容:

声明为 const 的对象保证在其生命周期内保持不变,而不是在整个程序执行期间保持不变。因此,const 对象不能用于常量表达式。

但是在下面的程序中,由于const限定变量的生命周期与程序执行的生命周期是一样的,为什么在之后使用它还是会报错caseswitch-case 语句中,需要常量的地方?它给出了以下错误:

|11|错误:case 标签没有缩减为整数常量|

#include<stdio.h>

const int x=2;

int main(void)
{

switch(2)
{
case 1:
printf("Hello");
break;
case x:
printf("Hola");
}

}

最佳答案

C 对常量表达式中可以使用的内容有严格限制的原因是允许:

  1. 简单的编译器实现,
  2. 简单的链接器实现,以及
  3. 高效的代码生成

对于具有内部 链接的全局 const 限定变量,允许它们出现在常量表达式中不会太昂贵。它不需要影响上面的第 2 项和第 3 项,只影响第 1 项。但通常(可能是外部链接),允许它们意味着:

  1. 编译器需要留出余量(某种重定位),以便在链接时不仅解析地址,还解析该地址的。一般来说,这个问题和完整的程序一次/链接时间优化一样困难,标准不需要。在某些特殊情况下,它可能不需要如此强大的解决方案。

  2. 链接器必须能够处理基于重定位的复杂表达式的计算:不仅是地址常量,还有值,因此,您可以合法地从这些值派生出所有表达式。

  3. 在 switch 的情况下,如果编译器不知道 case 标签的值,则有效的实现(跳转表或条件二叉树)都将被排除。这可以通过将所有工作转移到链接时(program-at-once/LTO)来解决。

关于c - 为什么我们甚至不允许在 switch-case 中使用全局 const 限定变量?IBM 支持门户提示我们可以,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16588860/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com