Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C #在嵌入式环境中定义vs enum(它们如何编译?)_C_Enums_Embedded_Firmware - Fatal编程技术网

C #在嵌入式环境中定义vs enum(它们如何编译?)

C #在嵌入式环境中定义vs enum(它们如何编译?),c,enums,embedded,firmware,C,Enums,Embedded,Firmware,这个问题已经解决了,我同意Enum是一条出路。然而,我很好奇,在最终的代码中枚举是如何编译的?#定义只是字符串替换,但是枚举会向编译的二进制文件添加任何内容吗?或者他们在那个阶段都是等价的。当编写固件和内存非常有限时,使用#defines(定义)有什么好处吗 谢谢 编辑:根据下面评论的要求,所谓嵌入式,我指的是数码相机 谢谢你的回答!我完全支持Enum 一个enum最终只是一个整数。编译器传播这些值,就像对待常量一样如果不以其他方式进行分析或测量,就不可能说 但是,任何像样的编译器都不会显示任何

这个问题已经解决了,我同意Enum是一条出路。然而,我很好奇,在最终的代码中枚举是如何编译的?#定义只是字符串替换,但是枚举会向编译的二进制文件添加任何内容吗?或者他们在那个阶段都是等价的。当编写固件和内存非常有限时,使用#defines(定义)有什么好处吗

谢谢

编辑:根据下面评论的要求,所谓嵌入式,我指的是数码相机


谢谢你的回答!我完全支持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)
    并传递一个定义的值。