我的代码如下,因为定义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;
.........
是不变的。
我的目标是
test_X
是test_X
的常量值。switch case
运行switch case
,address
address
1 to X
。address++
。我得到temp
值来做另一个代码。答案 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 macros和enum
。我不确定,但这可能不是一个很好的方法。
首先为所需数量的实体创建一个宏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;
}