可变的修改,但错误,怎么样?

时间:2011-06-12 12:39:05

标签: c constants

好的,我知道这可能很难看,但是我无法理解为什么我无法使用TILES_XTILES_YTILES_TOTAL作为全局数组长度,海湾合作委员会一直在哭“它在文件范围内进行了各种修改”。

    /* 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来解决。

1 个答案:

答案 0 :(得分:4)

按6.6,第6段:

  

整型常量表达式应具有整数类型,并且只能有操作数   它是整数常量,枚举常量,字符常量,sizeof   结果为整数常量的表达式,以及浮点数常量   立即操作演员阵容。仅在整数常量表达式中转换运算符   将算术类型转换为整数类型,但作为sizeof的操作数的一部分除外   操作

(强调我的)

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

在任何情况下,为此目的使用浮点几乎肯定是错误的。切换到使用整数数学,一切都会正常工作。

修改例如,您应该乘以866然后除以1000,而不是乘以0.866f