【问题标题】:Converting macros to enum types in C在 C 中将宏转换为枚举类型
【发布时间】:2016-07-19 01:44:47
【问题描述】:

我有点困惑。在我们的生产环境中,已经定义的宏很少。这些宏用于返回一些值。现在我们的要求是根据这些宏的值准备一些查找。我创建了 char* 数组并在适当的索引处定义了一些字符串。但是我的经理要求我将这些宏转换为枚举类型,然后进行查找。如何使用枚举实现这一点?这样做有什么好处?这些宏被用于许多不同的文件中。如果我定义了枚举类型,我是否必须更改任何内容? 提前致谢!

示例代码:

#define macro_1 1
#define macro_2 2
#define macro_3 3
#define macro_4 4

查找:

const char* lookup[] = {.....};

【问题讨论】:

  • 一个直接的优势是使用数组需要顺序增加的宏值(即 0、1、2、3、4,...)。使用枚举时,值可以是任意整数。
  • @Rushy Panchal:感谢您的及时帮助。你能给我举个例子吗?是否可以使用枚举类型进行查找?如何在枚举中定义字符串?

标签: c enums macros


【解决方案1】:
  1. 如何使用枚举来实现?
    我想您的经理要求您将宏映射到枚举类型。您可以简单地定义一个枚举类型,只要宏都具有整数值,并且枚举值不使用与宏相同的名称。

  2. 这样做有什么好处?
    通常不鼓励使用宏,因为它们在进入编译器之前会被值替换,与使用由编译器检查和管理的枚举类型相比,它可能容易出错。

  3. 这些宏被用于许多不同的文件中。如果我定义了枚举类型,是否需要更改任何内容?
    不幸的是。但是,如果您的宏被隔离在中心头文件中,您可以通过重命名宏并将原始名称命名为枚举值来解决问题。

您可能会发现这篇文章很有用。 http://www.cs.utah.edu/~germain/PPS/Topics/C_Language/enumerated_types.html

一些代码

#include <stdio.h>

#define old_macro_1 1
#define old_macro_2 2
#define old_macro_3 3

enum MacroValues {
  macro_1 = old_macro_1,
  macro_2 = old_macro_2,
  macro_3 = old_macro_3
};

void test_macros(void)
{
  const char* lookup[] = {"M0", "M1", "M2", "M3"};
  // use an enum variable directly
  printf("enum MacrosValues %d\n", macro_1);
  // define an enum variable to use as index
  enum MacroValues m1 = macro_2;
  printf("lookup[%d] = %s\n", m1, lookup[m1]);
}

int main(void)
{
  test_macros();
  return 0;
}

【讨论】:

    猜你喜欢
    • 2017-10-14
    • 1970-01-01
    • 2023-02-21
    • 2013-01-23
    • 2019-06-09
    • 2020-08-21
    • 2010-12-21
    • 2012-09-30
    • 1970-01-01
    相关资源
    最近更新 更多