繁体   English   中英

可变修改,但错误,如何?

[英]Variably modified, but err, how?

好的,我明白这可能很难看,但我不明白为什么我不能使用TILES_XTILES_YTILES_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 . integer 常量表达式中的强制转换运算符只能将算术类型转换为 integer 类型,但作为 sizeof 运算符的操作数的一部分除外。

(强调我的)

在大多数情况下,您不能在 integer 常量表达式中使用浮点(这是数组维度所必需的)。

无论如何,您为此目的使用浮点数几乎肯定是错误的。 切换到使用 integer 数学,一切都会正常工作。

编辑:例如,而不是乘以0.866f ,您应该乘以 866 然后除以 1000。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM