“ Initializer元素不是常数”-但显然是

强大的猪肉

我知道消息的含义,但不知道为什么会发生。

main.c:26:2: error: initializer element is not constant
  rgb24_xrgb(0xB14835), // brick red

我的代码:

typedef uint32_t rgb24_t;

// Color structure
typedef struct {
    uint8_t r;
    uint8_t g;
    uint8_t b;
} xrgb_t;

// Table of colors
const xrgb_t COLORS[] = {
    rgb24_xrgb(0xB14835), // brick red
    rgb24_xrgb(0x4C1661), // indigo
    rgb24_xrgb(0xA3268E), // royal purple
};

这是我的宏:

#define xrgb(rr, gg, bb) ((xrgb_t) { .r = ((uint8_t)(rr)), .g = ((uint8_t)(gg)), .b = ((uint8_t)(bb)) })
#define rgb24_r(c) ((((rgb24_t) (c)) >> 16) & 0xFF)
#define rgb24_g(c) ((((rgb24_t) (c)) >> 8) & 0xFF)
#define rgb24_b(c) ((((rgb24_t) (c)) >> 0) & 0xFF)
#define rgb24_xrgb(c) xrgb(rgb24_r(c), rgb24_g(c), rgb24_b(c))

预处理器输出在这里:

const xrgb_t COLORS[] = {
    ((xrgb_t) { .r = ((uint8_t)(((((rgb24_t) (0xB14835)) >> 16) & 0xFF))), .g = ((uint8_t)(((((rgb24_t) (0xB14835)) >> 8) & 0xFF))), .b = ((uint8_t)(((((rgb24_t) (0xB14835)) >> 0) & 0xFF))) }),
    ((xrgb_t) { .r = ((uint8_t)(((((rgb24_t) (0x4C1661)) >> 16) & 0xFF))), .g = ((uint8_t)(((((rgb24_t) (0x4C1661)) >> 8) & 0xFF))), .b = ((uint8_t)(((((rgb24_t) (0x4C1661)) >> 0) & 0xFF))) }),
    ((xrgb_t) { .r = ((uint8_t)(((((rgb24_t) (0xA3268E)) >> 16) & 0xFF))), .g = ((uint8_t)(((((rgb24_t) (0xA3268E)) >> 8) & 0xFF))), .b = ((uint8_t)(((((rgb24_t) (0xA3268E)) >> 0) & 0xFF))) })
};

对我来说看起来很稳定。

问题出在哪儿?

毫米

从C11 6.7.9 / 4(C99具有类似文本):

具有静态或线程存储持续时间的对象的初始化程序中的所有表达式应为常量表达式或字符串文字。

从C11 6.6“常量表达式”开始:

初始值设定项中的常量表达式允许更大的自由度。该常数表达式应为以下值之一或计算为以下值之一:

  • 算术常数表达式
  • 空指针常量,
  • 地址常数,或
  • 完整对象类型加上或减去整数常量表达式的地址常量。

复合文字不是这些要点,因此在初始化程序中是不允许的。

如果复合文字的初始化程序都是满足这些条件的常量表达式,我看不出为什么不允许这样做的任何理由

但是,您可以通过不使用复合文字的初始化程序来解决此问题:

const xrgb_t COLORS[] = {
    { .r = ........... , .g = ............., .b = ........ },
    { .r = .......  // etc.
};

在现有代码中,通过重命名宏以给出{ }部分,然后再使用另一个具有原始名称的宏(const xrgb_t) rgb24_xrgb(X)来完成复合文字或其他操作,这应该很容易做到

注意 const编写复合文字可以使编译器将其存储在只读区域中。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么我的应用程序告诉我剪贴板显然是空的,却不是空的?

来自分类Dev

为什么__init__显然是可选的?

来自分类Dev

显然是随机编码的URL请求

来自分类Dev

我刚制作的程序显然是病毒?C ++

来自分类Dev

更改JScrollPane中的JScrollBars值的问题:90显然是幻数

来自分类Dev

PHP相等似乎在foreach循环中显然是错误的

来自分类Dev

交换tmpfs(显然是个坏主意,但是可能吗?)

来自分类Dev

无法检查bash中的校验和---显然是错误的语法?

来自分类Dev

Blender Python`bpy``__init __。py`,显然是从不存在的模块'_bpy'导入的

来自分类Dev

Java显然是按价值传递的,但需要澄清一下

来自分类Dev

试图获取非对象的属性(当它显然是对象的属性时)

来自分类Dev

class-validator对IsDateString的验证失败,“必须为ISOString,但是记录的值显然是ISO String?

来自分类Dev

在Python中更新列表:为什么函数中的for循环的作用域显然是全局的?

来自分类Dev

每个导入函数都会以“未定义”的形式出现,尽管显然是在进行导入

来自分类Dev

LEFT JOIN是否有针对右表的多个选项,显然是不好的

来自分类Dev

Blender Python`bpy``__init __。py`,显然是从不存在的模块'_bpy'导入的

来自分类Dev

如何删除记事本++中显然是控制字符的内容?

来自分类Dev

主题更改后应用程序崩溃(显然是由片段引起的)

来自分类Dev

显然不是IndexOutOfRange

来自分类Dev

std :: ifstream :: in和std :: ios :: in有什么区别?(显然是C ++中std :: ifstream的openmode标志)

来自分类Dev

初始化程序元素不是编译时间常数

来自分类Dev

C中的全局变量链表队列?(初始化元素不是常数)

来自分类Dev

Haskell:为什么不能在id的域显然是该函数中所需类型的超集的另一个函数中使用id?

来自分类Dev

Xarray读取文件中的数据作为坐标,显然是索引坐标,如何将实际数据从坐标转换为数据变量?

来自分类Dev

Windows 7 Backup错误0x81000037显然是由重新解析点引起的,我该怎么办?

来自分类Dev

为什么现在创建/ dev / md1显然是/ dev / md127或/ dev / md127p1是什么?

来自分类Dev

我无法插值我的哈希,因为它显然是nil类吗?有人能对此有所启发吗?

来自分类Dev

在这段代码中得到“窗口未在第 18 行定义”,即使我 99% 确定我定义它显然是错误的,但我知道是什么

来自分类Dev

我的Python多进程显然不是独立的

Related 相关文章

  1. 1

    为什么我的应用程序告诉我剪贴板显然是空的,却不是空的?

  2. 2

    为什么__init__显然是可选的?

  3. 3

    显然是随机编码的URL请求

  4. 4

    我刚制作的程序显然是病毒?C ++

  5. 5

    更改JScrollPane中的JScrollBars值的问题:90显然是幻数

  6. 6

    PHP相等似乎在foreach循环中显然是错误的

  7. 7

    交换tmpfs(显然是个坏主意,但是可能吗?)

  8. 8

    无法检查bash中的校验和---显然是错误的语法?

  9. 9

    Blender Python`bpy``__init __。py`,显然是从不存在的模块'_bpy'导入的

  10. 10

    Java显然是按价值传递的,但需要澄清一下

  11. 11

    试图获取非对象的属性(当它显然是对象的属性时)

  12. 12

    class-validator对IsDateString的验证失败,“必须为ISOString,但是记录的值显然是ISO String?

  13. 13

    在Python中更新列表:为什么函数中的for循环的作用域显然是全局的?

  14. 14

    每个导入函数都会以“未定义”的形式出现,尽管显然是在进行导入

  15. 15

    LEFT JOIN是否有针对右表的多个选项,显然是不好的

  16. 16

    Blender Python`bpy``__init __。py`,显然是从不存在的模块'_bpy'导入的

  17. 17

    如何删除记事本++中显然是控制字符的内容?

  18. 18

    主题更改后应用程序崩溃(显然是由片段引起的)

  19. 19

    显然不是IndexOutOfRange

  20. 20

    std :: ifstream :: in和std :: ios :: in有什么区别?(显然是C ++中std :: ifstream的openmode标志)

  21. 21

    初始化程序元素不是编译时间常数

  22. 22

    C中的全局变量链表队列?(初始化元素不是常数)

  23. 23

    Haskell:为什么不能在id的域显然是该函数中所需类型的超集的另一个函数中使用id?

  24. 24

    Xarray读取文件中的数据作为坐标,显然是索引坐标,如何将实际数据从坐标转换为数据变量?

  25. 25

    Windows 7 Backup错误0x81000037显然是由重新解析点引起的,我该怎么办?

  26. 26

    为什么现在创建/ dev / md1显然是/ dev / md127或/ dev / md127p1是什么?

  27. 27

    我无法插值我的哈希,因为它显然是nil类吗?有人能对此有所启发吗?

  28. 28

    在这段代码中得到“窗口未在第 18 行定义”,即使我 99% 确定我定义它显然是错误的,但我知道是什么

  29. 29

    我的Python多进程显然不是独立的

热门标签

归档