【问题标题】:C share multiple enums among different filesC在不同文件之间共享多个枚举
【发布时间】:2021-06-01 21:23:53
【问题描述】:

如果我的术语不完美,我深表歉意,我是一名自学成才的程序员 :) 我的自动机器有不同的移动部件,对于每个部件我都有一个 C 文件来处理它自己的状态机。 每个 C 文件都有一个枚举,定义了该状态机的所有状态,例如:

movingArm.c

enum { 
    STANDBY = 0,
    ARM_OPEN,
    ARM_CLOSE,
    ARM_WAIT  
};


void state_machine_arm()
{
    switch(status_arm)
    {
        case STANDBY:
            // ....
        break;

        /* etc */
    }
} 

一切运行顺利,但有时我必须从另一个文件检查一个状态机的状态,因此将所有枚举放在一个公共位置以供所有文件访问会很方便。而不是每次都检查哪个数字对应于哪个状态并且有很大的遗漏风险。

所以问题是:在这种情况下,最佳做法是什么?是否可以将所有枚举组合在一个头文件中并包含在所有 .c 文件中?

编辑: 我补充了一些细节,也许我不够清楚。 如果从另一个文件anotherPart.c我想检查手臂的状态:

if( get_status_arm() == ARM_OPEN )
{
    // do something
}

我需要知道ARM_OPEN对应什么,所以ARM_OPEN也应该定义在anotherPart.c

这就是为什么我想到了一个通用的头文件,以避免在 anotherPart.c 中重新声明枚举(如果我必须在枚举中添加或更改某些内容会更烦人)

【问题讨论】:

  • 考虑使用其他软件生成一些 C 代码(可能是一些 #include-d 文件)。从swig.org 中汲取灵感,或许在您自己的 C 代码生成器中使用 GNU bison
  • 你基本上回答了你的一个问题。只需将enum 放在某个头文件中,然后将其包含在您需要的任何位置
  • 请澄清您需要在 .c 文件之间共享的是枚举类型的声明(在这种情况下,@Jabberwocky 评论将是答案)或者您是否指的是需要定义了一个并声明用于许多 .c 文件。您可以通过显示两个或三个文件的minimal reproducible example 来说明您所描述的内容。您可能还需要澄清您是否在执行多线程/任务。
  • @Val 不,这不是坏习惯,它甚至是一种非常流行的做法。
  • is that correct to have multiple enums in a single header file 不是最好的例子,但two enums in the same .h file。状态机是人人都写过的东西,网上研究怎么用C写,例子不胜枚举。我的第一个谷歌点击 this pdf 看起来不错。还有stackoverflow.com/questions/133214/….

标签: c enums


【解决方案1】:

所以问题是:在这种情况下,最佳做法是什么?是否可以将所有枚举组合在一个头文件中并包含在所有 .c 文件中?

是的,这将是最佳做法。 typedef enum { ... } arm_state_t; 在头文件中。然后在同一个文件中提供一个 getter 函数,它可以将内部状态返回给感兴趣的人:

arm_state_t get_status_arm (void);

此外,与往常一样,在标题中使用包含防护。 Creating your own header file in C

【讨论】:

  • 谢谢。还有一件事:如果不同的 ENUMS 有一些具有相同名称的元素(不同枚举之间的名称相同,而不是同一个)怎么办?看起来编译器不喜欢它..
  • @Val 枚举常量 (enum { /* this stuff here */ }) 与大多数其他标识符位于相同的命名空间中。不要与拥有自己私有命名空间的结构/联合成员混淆。这通常通过源代码前缀来解决,将它们命名为 ARM_ 等,就像您的情况一样。
猜你喜欢
  • 2017-10-22
  • 2023-02-20
  • 2014-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-15
  • 2012-01-10
  • 2012-03-19
相关资源
最近更新 更多