c - 可变修改,但是呃,怎么修改?

标签 c constants

好吧,我知道这可能很难看,但我不明白为什么我不能使用TILES_XTILES_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/

相关文章:

c - 通过非const指针修改const int

c - Valgrind 创建链表数组时出错(用于哈希表链接)

javascript - 如何在javascript中创建自定义对象的公共(public)常量实例?

c - 如何在 C 中检索数据而不是整行?

C 编程抽象 - typedef 外部声明

c++ - 如果我删除了 const,为什么这个使用 boost::shared_ptr 的调用不能在 C++ 中编译?

variables - 在 clojure 中定义多个常量变量

c++ - C++ 中的普通常量变量

c - Scanf 在 C 中跳过每隔一个 while 循环

c - 替换C中字符串的元素