好吧,我知道这可能很难看,但我不明白为什么我不能使用TILES_X
、TILES_Y
或 TILES_TOTAL
作为全局数组长度,GCC 提示它“在文件范围内可变修改”。
/* How many points should be in each tile? */
/* NOTE: MUST BE POWER OF TWO */
#define TILE_WIDTH 32
#define TILE_HEIGHT TILE_WIDTH
#define TILE_AREA ( TILE_WIDTH * TILE_HEIGHT )
/* How far should the origin of each tile be spaced? */
#define TILE_OFFSET_X TILE_WIDTH
#define TILE_OFFSET_Y ( TILE_HEIGHT * 0.866f )
/* Relative to the origin, where does the tile really end? */
#define TILE_MIN_X 0.0f
#define TILE_MIN_Y 0.0f
#define TILE_MAX_X ( TILE_OFFSET_X + 0.5f )
#define TILE_MAX_Y ( TILE_OFFSET_Y + 0.5f )
/* How many tiles should be cached offscreen? */
#define TILE_BLEED 2
#define CAMERA_WIDTH 256.0f
#define CAMERA_HEIGHT 192.0f
#define TILES_X ( ( size_t ) ( ( float ) ( ( CAMERA_WIDTH * 2.0f ) + ( TILE_BLEED * ( TILE_WIDTH + TILE_WIDTH ) ) ) / ( float ) TILE_OFFSET_X ) )
#define TILES_Y ( ( size_t ) ( ( float ) ( ( CAMERA_HEIGHT * 2.0f ) + ( TILE_BLEED * ( TILE_HEIGHT + TILE_HEIGHT ) ) ) / ( float ) TILE_OFFSET_Y ) )
#define TILES_TOTAL ( TILES_X * TILES_Y )
TILES_X expands to:
( ( size_t ) ( ( float ) ( ( 256.0f * 2.0f ) + ( 2 * ( 32 + 32 ) ) ) / ( float ) 32 ) )
哪个应该评估为常数,对吗?我的意思是,那里没有任何东西,没有任何变量。如果我尝试用这个初始化器定义一个变量,它会再次提示它是如何可变修改的。我不明白怎么办。还有其他关于相同错误的帖子,但它总是使用枚举或定义而不是 const int 来解决。
最佳答案
根据 6.6 第 6 段:
An integer constant expression shall have integer type and shall only have operands that are integer constants, enumeration constants, character constants, sizeof expressions whose results are integer constants, and floating constants that are the immediate operands of casts. Cast operators in an integer constant expression shall only convert arithmetic types to integer types, except as part of an operand to the sizeof operator.
(强调我的)
大多数情况下,您不能在整数常量表达式中使用浮点(这是数组维度所必需的)。
无论如何,您为此目的使用浮点几乎肯定是错误的。切换到使用整数数学,一切都会正常工作。
编辑:例如,您应该乘以 866,然后除以 1000,而不是乘以 0.866f
。
关于c - 可变修改,但是呃,怎么修改?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6321983/