微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

C 常量表达式 const 变量作为常量表达式

如何解决C 常量表达式 const 变量作为常量表达式

根据 6.6.10

10 一个实现可以接受其他形式的常量表达式。

实现可能会考虑将 const(或什至不考虑 const,因为答案关注它 - 但它不是问题的核心)变量作为常量表达式。

我的逻辑正确吗?如果不是为什么?

一些例子:

//file scope

int a = 5;
const int b = 10;

int c[a];
int d[b];

IMO 都符合要求。它们可以被评估编译时间。该值是已知的,并且静态数组的大小是已知的编译时间。

volatile int x = 5;  //cannot be considered as kNown compile time. ????
void foo(int a)
{
    static int b[a];
}

在这个例子中,a 不能在编译时计算 - 所以它不能用作常量表达式

解决方法

常量表达式与 const 限定符没有任何关系。整数常量表达式的定义见6.6/6。

6.6/10 参考了同一章前面提到的整数常量表达式、初始化器中的常量表达式等部分。我相信引用的部分指的是各种极端情况,例如:

static int x;
static int y = (int)&x;

这并不严格,因为 &x 不被视为整数常量表达式,而是地址常量。 gcc 和 clang 都不接受它。我相信 6.6/10 允许编译器支持像上面例子那样的代码作为实现定义的扩展。

,

以@ryyker 评论中的 the link 为基础。

在 C 中,如果表达式完全由编译时常量(即文字)组成,则该表达式被认为是常量。不接受 const 变量,因为 const 不一定意味着“常量”;它只是意味着从当前编译单元的角度来看一个变量是不可变的(只读)。

考虑这样一个函数...

int add(const int a,const int b) {
    return a + b;

您可以通过传入编译时常量来调用此函数,但也可以传入可变变量。如果您传入一个变量,就该范围而言,它被视为 const(只读),但它的值在编译时仍然未知,因此它不是“常量”。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。