C #在嵌入式环境中定义vs enum(它们如何编译?)
这个问题已经解决了,我同意Enum是一条出路。然而,我很好奇,在最终的代码中枚举是如何编译的?#定义只是字符串替换,但是枚举会向编译的二进制文件添加任何内容吗?或者他们在那个阶段都是等价的。当编写固件和内存非常有限时,使用#defines(定义)有什么好处吗 谢谢 编辑:根据下面评论的要求,所谓嵌入式,我指的是数码相机C #在嵌入式环境中定义vs enum(它们如何编译?),c,enums,embedded,firmware,C,Enums,Embedded,Firmware,这个问题已经解决了,我同意Enum是一条出路。然而,我很好奇,在最终的代码中枚举是如何编译的?#定义只是字符串替换,但是枚举会向编译的二进制文件添加任何内容吗?或者他们在那个阶段都是等价的。当编写固件和内存非常有限时,使用#defines(定义)有什么好处吗 谢谢 编辑:根据下面评论的要求,所谓嵌入式,我指的是数码相机 谢谢你的回答!我完全支持Enum 一个enum最终只是一个整数。编译器传播这些值,就像对待常量一样如果不以其他方式进行分析或测量,就不可能说 但是,任何像样的编译器都不会显示任何
谢谢你的回答!我完全支持Enum 一个
enum
最终只是一个整数。编译器传播这些值,就像对待常量一样如果不以其他方式进行分析或测量,就不可能说
但是,任何像样的编译器都不会显示任何显著的差异。此外,您应该总是更喜欢可读的、类型安全的代码,而不是高效的、不可读的、充满陷阱的代码。在证明以下两点之前,不要开始优化效率而不是可读性:
你实际上需要提高效率
您正在更改的程序部分已被探查器显示为瓶颈
在标准术语中,这两个表达式都是常量表达式,因此任何健全的编译器都应该在编译时对它们进行全面评估。需要恶意的病态编译器才能生成不同的代码。“嵌入式”可以指从Nexus S到航空电子系统的任何东西。如果你想要一个有意义的答案,你应该缩小范围(哪个芯片,哪个编译器,哪个版本?)。我同意回答者,应该把它和“代码> const <代码>类似。”马修:我想你是在考虑C++。在C语言中,#define
和enum
可以创建常量表达式,但是const
变量从来都不是常量表达式,访问它几乎肯定会导致实际的代码大小和性能损失(从内存中加载)。@R,关于const
在C99中不是常量表达式的说法是正确的(我确实需要仔细阅读)。但在简单的情况下,编译器仍然可以避免为它们分配内存。例如,如果我将const int a=1;
放在一个头中,那么int b=a;
主要来说,编译器可能足够聪明,不会为a
分配内存。通常,编译器会避免这种类型的智能,因为它与t兼容传统的链接器黑客可能会覆盖符号。@Mathew:我不认为这个问题在任何情况下都是特别针对“嵌入式”的,而且哪个芯片/编译器或其他什么应该没有什么区别,这是一个更一般的问题。我完全同意你关于不必要的优化的观点!我刚刚加入了一个项目,定义就是我们ed,所以我想知道是否有效率的原因。在这种情况下,您可能不需要像这样进行分析和测量——只需查看生成的程序集,它应该是相同的。在标准术语中,它们不仅是常量表达式,而且是整数常量表达式。这里的差异很重要,因为对于第一个,例如一个地址常量也是合格的。只有当它是后者时,它们才可能出现在类型声明和其他enum
常量的定义中。作为数组长度,它们在普通数组和VLA之间起到了区别。@nqtronix:我看不出这个注释与我的答案(或问题)有什么关系@R..My bad,我想对下面的答案进行评论。我修复了它并添加了说明。enum
值是一个常量表达式,而const
变量(在C中)不是,因此不能用于静态初始化,case
标签,enum
值是编译时常量,const
变量是运行时常量(从语言的角度来看,编译器可以自由地对const
变量进行常量传播)枚举只是一个“int”,特别是。至少GCC默认情况下将枚举视为32位值,即使在16位或8位MCU上也是如此。若要使用尽可能最小的类型,必须指定-fshort enums选项进行编译。(若要延迟编辑),这在用作函数参数时尤其重要:func(枚举值)
compiles(默认情况下)大于func(unit8_t value)
并传递一个定义的值。