我的问题是:当i=1时
P_COMInit(i) = do { P_SEGi_OUTMODE();}while(0)
但不是
do{P_SEG1_OUTMODE();}while(0)
我怎样才能达到我想要的?
我想用宏定义替换上面的代码
#define P_COMInit(n)
{\
do{P_COM##n##_OUTMODE();\
}while(0);\
}\
#define P_SEGInit(n) do{P_SEG##n##_OUTMODE();}while(0)
#define MAX_COM_NUM 2
#define MAX_SEG_NUM 7
void main(void)
{
/*
P_COM1_OUTMODE();
P_COM2_OUTMODE();
P_SEG1_OUTMODE();
P_SEG2_OUTMODE();
P_SEG3_OUTMODE();
P_SEG4_OUTMODE();
P_SEG5_OUTMODE();
P_SEG6_OUTMODE();
P_SEG7_OUTMODE();*/
//I want to replace the code above with the below
uchar i;
for(i = 1;i <= MAX_COM_NUM;i++)
{
P_SEGInit(i);
}
for(i = 1;i <= MAX_SEG_NUM;i++)
{
P_COMInit(i);
}
}
2条答案
按热度按时间blmhpbnm1#
最初它不是我的宏(我不是作者-作者的名字被我忘记了,但有时我会使用它)
它会发出:
xmq68pz92#
如果你打算使用宏(最后一招),那么至少坚持使用标准化的“X宏”。这些宏在程序中的一个地方收集所有数据,以最大限度地减少重复。易于维护,非常灵活,但很难阅读。
在这种情况下,您可以像这样创建X宏列表:
您可以使用这些列表创建宏常量
MAX_COM_NUM
等,然后创建一个枚举来“计数”项目的数量。即使你不打算使用它们作为枚举,你现在有一个预处理器项
MAX_COM_NUM
等于2和一个MAX_SEG_NUM
等于7。如果你喜欢的话,你甚至可以使用X-macros来生成实际的函数(尽管我不推荐这样做,在宏中维护/调试代码并不有趣):
你可以像这样调用和执行所有的函数:
示例:
输出: