【问题标题】:Enum or define in returned C function [closed]在返回的 C 函数中枚举或定义 [关闭]
【发布时间】:2021-11-19 09:46:22
【问题描述】:

对于代码的可读性和代码的进一步文档,哪个更好?像这样定义返回值和返回函数?

#define RETURN_OK       0
#define RETURN_NOT_OK   -1

int do_it(void)
{
    /*...*/
    return RETURN_OK;
}

或创建单独的枚举?

typedef enum
{
    RETURN_NOT_OK = -1,
    RETURN_OK = 0
} RET_VAL;

RET_VAL do_it(void)
{
    /*...*/
    return RETURN_OK;
}

【问题讨论】:

  • 这是非常值得商榷和基于意见的,这不是这里的主题,但通常更具体的事情(后者)总是更好。
  • 如果enum 不够长,我通常更喜欢#define 样式。所以,对于这个特定的例子,我更喜欢#define 版本。此外,RET_VAL 的名称也很尴尬。话虽如此,这些类型的事情都是主观的。选择你自己的风格。
  • 我喜欢枚举,因为调试器将数值转换为符号,这使得调试更容易
  • @cornuz 谁告诉你的? godbolt.org/z/Ghaq8b6G3
  • @cornuz 然后删除误导性评论

标签: c readability


【解决方案1】:

我认为一般来说使用枚举是更好的风格,因为您正在记录您的函数返回一组有限的东西的意图(即使编译器实际上可能不会检查这一点,这可能是一个缺点);但正如其中一个 cmets 所指出的,许多编译器会给出枚举提示,并且在调试时会返回枚举字符串而不是神秘的数字值。

在初始化静态作用域结构变量时,枚举用作编译时常量时还有其他优势。

【讨论】:

    【解决方案2】:

    C 对整数和枚举几乎不存在类型安全性,因此使用枚举不会获得更好的类型安全性。枚举常量(这些:RETURN_OK)实际上被定义为 int 类型,而不是更有意义的枚举类型,这并不完全有帮助。

    尽管在How to create type safe enums? 的问题中提到,如果您使用指针而不是按值传递,您也可以获得更好的类型安全性。

    如果您使用枚举类型,静态分析器可能能够找到与类型相关的错误——但这仅在您实际使用静态分析器的情况下才重要。例如,MISRA-C 使用的系统将枚举视为和对待它们自己的类型,因此 MISRA 检查器在使用原始整数值而不是枚举常量等时会出错。

    但归根结底,它归结为 C 代码库中的事实上的编码标准。为错误代码保留库中所有函数的返回值是一种非常常见的 API 设计,然后该错误代码通常被赋予其自己的类型,通常以枚举的形式。所以我会选择enum 版本,因为这是大多数人使用的版本,无论是为 *nix、Windows 还是嵌入式系统编码。

    【讨论】:

      【解决方案3】:

      #defineenum 都是不同的,(尽管在你的情况下,差异是无关紧要的)。

      但我更喜欢enum,因为它们也可以用作数据类型。

      例子

      void doSomething(RET_VAL result)
      {...}
      
      {
         RET_VAL choice = RETURN_OK
         switch(choice) {
          case RETURN_OK: break;
          case RETURN_NOT_OK: break;
      
      }
      }
      

      这使代码更具可读性

      【讨论】:

        【解决方案4】:

        对于代码的可读性和代码的进一步文档,哪个更好?

        非常主观。这在很大程度上取决于开发人员的个人品味和偏好、特定用例、项目代码指南。

        比较两个提供的版本时,第二个版本更好,因为函数声明用作说明do_it 的返回值是RET_VAL 枚举之一的文档。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-10-26
          • 1970-01-01
          • 1970-01-01
          • 2023-04-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多