【问题标题】:sizeof(struct foo) not constant?sizeof(struct foo) 不是常数?
【发布时间】:2013-09-01 02:35:48
【问题描述】:

我正在使用 Microchips XC8 C 编译器 1.12 进行开发。

我有以下代码 sn-p 但编译器对此不满意。

struct _foo {
    int a;
};

enum BAR {
    CONST1 = sizeof(struct _foo)
};

我得到的错误是:main.c:6: error: integer expression required 为什么会产生该错误? C中任何结构的大小都不是常数吗? 如果我使用 sizeof(int) 一切正常。

注意:XC8 编译器 v1.12 遵循 C90 标准,而不是现代 C99 标准。

PS这确实可以编译:

char abc[sizeof(struct _foo)];

而且这个表达式还需要是一个编译时常量,让我认为这实际上不是枚举声明中的问题。

【问题讨论】:

  • 这看起来像是编译器的限制。
  • @Gilles:不,可变长度数组不能是结构的成员。 (有灵活的数组成员,但它们对sizeof 报告的大小没有贡献。)
  • const int sizeof_foo = sizeof (struct _foo); enum BAR { CONST1 = sizeof_foo }; 有效吗?我不认为它会有所作为,但值得一试。
  • 保留以下划线开头的标识符;你不应该在你自己的代码中使用它们。 struct foo 是个好名字。
  • @KeithThompson 因为我刚刚在我的机器上安装了编译器来解决这个问题,我可以告诉你,不,没有区别

标签: c struct enums sizeof microchip


【解决方案1】:

这看起来像是 Microchip XC8 编译器的限制/错误。

在枚举常量定义中,当X 是聚合或联合类型或聚合类型的对象时,编译器不会将sizeof (X) 视为常量表达式(即使它实际上在c90 或c99 中)或联合类型。

【讨论】:

  • 是的,这是编译器限制,但不是您描述的限制,因为 sizeof(int) 有效。
  • @Gilles 演员修复了编译错误吗?编译器可能会对标准标量类型的大小做出一些限制“例外”。
  • @Gilles 我在我的机器上安装了编译器,确实我之前的解释不是很好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-18
  • 1970-01-01
  • 2019-11-23
相关资源
最近更新 更多