C如何定义多个变量,每个名称为switch case使用添加1

时间:2017-11-02 06:17:49

标签: c

我的代码如下,因为定义test_X会很多,可能是从test_1到test_100。 如果变量有100,我该如何简化代码。 我不想写100行。并且开关盒将从1到100运行100次。 我怎样才能编码智能? 谢谢!

enter code here

#define test_1 0x0001 #define test_2 0x0002 #define test_3 0x0003 #define test_4 0x0004 #define test_5 0x0005 #define test_6 0x0006 #define test_7 0x0007 #define test_8 0x0008 #define test_9 0x0009 #define test_10 0x000A #define test_11 0x000B #define test_12 0x000C #define test_13 0x000D // address will be address++ switch(address) { case test_1: temp = 1; break; case test_2: temp = 2; break; case test_3: temp = 3; break; case test_4: temp = 4; break; case test_5: temp = 5; break; ......... 是不变的。 我的目标是

  1. define test_Xtest_X的常量值。
  2. 依赖switch case运行switch caseaddress address 1 to X
  3. 不同的案例有不同的address++。我得到temp值来做另一个代码。

1 个答案:

答案 0 :(得分:0)

正如评论中所建议的那样,你可以使用数组和循环。

由于test_X是常量,让我们创建一个const数组来保存它们

const int test[100]={0x0001, 0x0002, 0x0003, 0x0004, 0x0005};

我只有5个条目,你添加其余条目。

现在,如果要分配给temp的值不遵循任何模式,请声明另一个数组以保存它们

int tempVal[100]={11, 22, 33, 44, 55}; //add the rest of the entries

现在使用像

这样的循环
for(int i=0; i<100; ++i)
{
    if(address==test[i])
    {
        temp=tempVal[i];
        printf("\n%d is the one", temp);
        break;
    }
}


另一种方法是使用X macrosenum。我不确定,但这可能不是一个很好的方法。

首先为所需数量的实体创建一个宏X_LIST,例如

#define X_LIST X(1, 0x0001, 1) X(2, 0x0002, 2) X(3, 0x0003, 3) X(4, 0x0004, 4)

其中参数是test_X变量的编号(例如:10表示test_10),test_X变量的值和要分配给temp的值

现在创建另一个宏X()(名称可以是任何名称。它不一定是X,因为它被称为X-macro),如

#define X(num, val, tempVal) test_##num=val,

这是我们使用的X()的第一个版本。此X()用于声明test_X

此处,test_X用作enum元素而不是宏。

现在让我们使用X()之类的

enum { X_LIST };

预处理后,此单行将扩展为

enum { test_1=0x0001, test_2=0x0002, test_3=0x0003, test_4=0x0004, };

此处,仅指定了4个元素,根据您的需要创建更多元素。

最后的逗号不是问题。

现在我们取消定义X()

#undef X

并将X()的第二个版本设为

#define X(num, val, tempVal) \
           case test_##num: \
       temp = tempVal; \
       break;

然后是switch声明

switch(address)
{
    X_LIST
}

最后取消定义X()

#undef X

就是这样。

对于4个元素,C预处理器会将其扩展为类似

的内容
 switch(address)
 {
  case test_1: temp = 1; 
               break; 
  case test_2: temp = 2;
               break;
  case test_3: temp = 3;
               break; 
  case test_4: temp = 4;
               break;
 }