gpt4 book ai didi

c - 为什么 const a + const b 不是 const 本身?

转载 作者:太空狗 更新时间:2023-10-29 15:24:17 25 4
gpt4 key购买 nike

我正在制作一个 pong 克隆来测试一个 SDK...我已经有几年没有 C 了。

无论如何,我尝试在 const 设置阶段这样做:

const int SCREEN_W = 480;
const int SCREEN_H = 480;
const int PLAYER_H_WIDTH = 50;
const int PLAYER_H_HEIGHT = 12;
const int BUFFER = 14;
const int LEFT_BUFFER = PLAYER_H_WIDTH+BUFFER;
const int RIGHT_BUFFER = SCREEN_W-LEFT_BUFFER;

除了编译器在 LEFT_BUFFERRIGHT_BUFFER 行抛出错误,这让我想知道,为什么?

如果答案是“因为标准这么说”我还想知道为什么(为什么标准这么说?)

由于评论而编辑:

hacks 注意到函数内的那些行(如 main(){})确实可以编译,而在文件范围内则不能。我也问,为什么?

另外,特定的 GCC(实际上是 MingW)错误是:initializer element is not constant

最佳答案

用静态存储持续时间声明的对象的初始值设定项(在任何函数之外,或在带有 static 关键字的函数内部)必须是常量表达式,或者必须仅包含常量表达式。

本声明:

const int PLAYER_H_WIDTH = 50;

不会使 PLAYER_H_WIDTH 成为常量表达式。关键字 const 实际上并不意味着“常量”(即能够在编译时求值);意思是“只读”。

所以当你声明时:

const int LEFT_BUFFER = PLAYER_H_WIDTH+BUFFER;

您正在尝试使用非常量表达式初始化 LEFT_BUFFER

引用:ISO C 标准,2011 版,第 6.7.9 节第 4 段:

All the expressions in an initializer for an object that has static or thread storage duration shall be constant expressions or string literals.

为了说明 constconstant 之间的区别,这个:

const int r = rand();

是一个完全有效的声明,只要它不在文件范围内。对象(我不想称它为“变量”)rconst(即只读),但不是常量(即,它的值无法在编译时确定)。

该声明不能出现在任何函数之外,因为 C 的执行模型不允许在输入 main 之前执行用户代码。

C++ 确实使此类对象成为常量如果初始化程序是常量且为整数类型; C 没有。 C++ 中的规则需要编译器做更多的工作;它根据其初始化程序的形式来确定对象的名称是否为常量表达式。我不确定为什么 C 没有采用 C++ 规则;委员会可能认为这不值得(请记住,任何新功能都会给每个编译器实现者带来负担)。

作为解决方法,您可以使用预处理器:

#define PLAYER_H_WIDTH 50
/* ... */
#define LEFT_BUFFER (PLAYER_H_WIDTH+BUFFER)

或者你可以对 enum 使用稍微丑陋的 hack:

enum { PLAYER_H_WIDTH = 50 };
enum { LEFT_BUFFER = PLAYER_H_WIDTH+BUFFER };

后者仅适用于 int 类型的常量。诀窍在于 enum 声明创建了一个枚举类型,但枚举数仍然是 int 类型。

关于c - 为什么 const a + const b 不是 const 本身?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21125528/

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