背景 在固件开发/维护期间,我通常不需要任何文档来处理C源代码。当代码处理数据成员初始化遍布各地的大数据结构时,跳转到不同的源文件和头文件变得非常具有挑战性,而且常常丢失。
所以我目前的解决方案是花几天时间来“扁平化”代码。我不知道什么是合适的术语,但基本上我所做的是扩展子函数并用传递给子函数的实际变量名替换输入参数变量名。 (请参阅下面的简化示例)
这项练习的结果非常有用,但这是一个非常手动和繁琐的过程。由于我正在使用固件,在一些支持跟踪功能的芯片上,可以使用JTAG调试器来完成此操作。但这种设置并不总是可用的。
我知道使用宏我可以使用预处理器来执行此操作,但如果存在这样的工具,我无法弄清楚如何使用子函数执行此操作。我试过谷歌“子功能扩展”等,到目前为止没有运气。如果您知道这样的工具存在或者我正在尝试做的正确术语,请告诉我,以便我可以在互联网上更好地搜索它。非常感谢!
int myGlobal;
void increment(int input)
{
input++;
}
void decrement(int input)
{
input--;
}
int doSomething(int input, int op)
{
if (op)
{
increment(input);
}
else
{
decrement(input);
}
}
int main(void)
{
int i, currMax;
int myOp = 1;
myGlobal = 0;
currMax = 5;
for (i = 0; i < currMax; i++)
{
doSomething(myGlobal, myOp);
}
currMax = 4;
myOp = 0;
for (i = 0; i < currMax; i++)
{
doSomething(myGlobal, myOp);
}
}
BECOMES
int main(void)
{
int i, currMax;
int myOp = 1;
myGlobal = 0;
currMax = 5;
for (i = 0; i < currMax; i++)
{
// doSomething(myGlobal, myOp);
if (myOp)
{
// increment(myGlobal);
myGlobal++;
}
else
{
decrement(myGlobal);
myGlobal--;
}
}
currMax = 4;
myOp = 0;
for (i = 0; i < currMax; i++)
{
// doSomething(myGlobal, myOp);
if (myOp)
{
// increment(myGlobal);
myGlobal++;
}
else
{
// decrement(myGlobal);
myGlobal--;
}
}
}