C/ c++程序设计中的一个问题

A problem in C/C++ programming

本文关键字:一个 问题 c++ 程序设计      更新时间:2023-10-16

我有两个不同条件的循环,但循环中的代码是相同的。

:

for (xx; xxxx; xxx)
{
    the Code
}
for (yy; yyyy; yyy)
{
    the Code
}

问题是代码太长,我想只写一次代码,并执行这两个不同的循环。

我怎么解决它?

也许你应该把长代码块在一个函数/方法和调用函数/方法在两个循环?

type blockOfCode() {
    block of code...
    return type; //Or if it's is void nothing obviously.
}
for (xx, xxx, xxxx)
    blockOfCode();
for (yy, yyy, yyyy)
    blockOfCode();

为什么不把它变成一个函数呢?这样你就有了一份代码副本,你所做的任何更改/bug修复都会在两个地方反映出来。

内联函数会使它更短,但就对icache的影响而言,它仍然会和你的代码一样长

一种解决方案是将代码放入(n内联)函数中,使其更短:

inline function a() { /* stuff */ }
for (x; xx; xxx) a();
for (y; yy; yyy) a();

您需要重构代码以将公共代码(在for循环中)移动到一个函数

为了完整起见,只有当你完全确定你不能使用一个函数时,才会有一个糟糕的(强调糟糕的!)回退;(有理由)可怕的宏:

#define TheCode(p1) 
    do { 
        line1...; 
        line2...maybe using p1...; 
        line3...; 
    } while (0)
for (xx; xxxx; xxx)
{
    TheCode(x);
}
for (yy; yyyy; yyy)
{
    TheCode(y);
}

这绝对不是推荐的解决方案;使用函数更好。但作为一种绝望之举,它可能会解决一些问题。总的来说,如果你不能使用一个函数,那么你现有的代码就有问题了,你应该在把它作为替代之前解决这些问题。

the Code放在一个函数中,你会从每个循环内部调用吗?这对你有用吗?

如果不知道两个for语句的条件是什么,或者不知道循环中条件的差异是如何出现的,那么很难确切地知道这里需要什么。而且,我肯定更愿意将它重构成另一个函数,而不是做一些hack的事情来让它工作,因为如果事情那么复杂,它很可能会有更多的问题,而不仅仅是重复。

但是,如果我做这样的事情,如果你有任何方法可以避免的话,我强烈建议不要这样做,但是你可以这样做(或者根据你的特定代码和for条件的性质对它进行一些变化):

改变:

原始代码

// ... some code 
for (int i=0; i < 5; ++i)
{
    // loop code  loop code  loop code
    // loop code  loop code  loop code
    // loop code  loop code  loop code
    // loop code  loop code  loop code
    // loop code  loop code  loop code
}
// ... more code
for (int j=11; j < 20; ++j)
{
    // loop code  loop code  loop code
    // loop code  loop code  loop code
    // loop code  loop code  loop code
    // loop code  loop code  loop code
    // loop code  loop code  loop code
}
// ... rest of code

:

修改代码
// ... some code
for (int i=0; i < 5; ++i)
{
    #include "badforloop.i"
}
// ... more code
for (int i=11; i < 20; ++i)
{
   #include "badforloop.i"
}
// ... rest of code

[注意:如果两个循环中的循环变量不是i,而是不同的变量,您应该修改它们使它们相同。]

新建文件:badforloop.i

    // loop code  loop code  loop code
    // loop code  loop code  loop code
    // loop code  loop code  loop code
    // loop code  loop code  loop code
    // loop code  loop code  loop code