C++ C/C中的一个问题&x2B+;程序设计

C++ C/C中的一个问题&x2B+;程序设计,c++,c,C++,C,我必须使用两个不同条件的循环,但是循环中的代码是相同的 像这样: for (xx; xxxx; xxx) { the Code } for (yy; yyyy; yyy) { the Code } 问题是代码太长,我只想写一次代码并执行这两个不同的循环 我怎样才能解决它呢?为什么不把它变成一个函数呢?这样,您将拥有一份代码副本,您所做的任何更改/错误修复都将反映在这两个地方 内联函数会使它变短,但就对icache的影响而言,它仍将与您的代码一样长。也许您应该将长代码块放在函数

我必须使用两个不同条件的循环,但是循环中的代码是相同的

像这样:

for (xx; xxxx; xxx)
{
    the Code
}

for (yy; yyyy; yyy)
{
    the Code
}
问题是代码太长,我只想写一次代码并执行这两个不同的循环


我怎样才能解决它呢?

为什么不把它变成一个函数呢?这样,您将拥有一份代码副本,您所做的任何更改/错误修复都将反映在这两个地方


内联函数会使它变短,但就对icache的影响而言,它仍将与您的代码一样长。

也许您应该将长代码块放在函数/方法中,并在两个循环中调用函数/方法

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();

一种解决方案是将代码放入(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);
}

这绝对不是推荐的解决方案;使用函数是优越的。但作为一种绝望的行为,它可能会解决一些问题。但是,总的来说,如果你不能使用函数,那么你的现有代码就会出现问题,你应该先解决这些问题,然后再使用它作为替代方法。

好吧,如果没有更多的上下文来说明你的两个
for
语句的条件是什么,你真的很难确切地知道你在这里需要什么,或者一些关于你的条件在循环中如何出现差异的线索。而且,我肯定更愿意将它重构成另一个函数,而不是做一些简单的事情来让它工作,因为如果事情如此复杂,它很可能会有更多的问题,而不仅仅是重复

但是,如果我必须这样做,并且如果您有任何方法可以避免的话,我非常建议您不要这样做,但是您可以这样做(或者根据您的特定代码和条件下的的性质而做一些变化):

更改此项: 原始代码
... 使用函数?请说得更具体些,否则这是一个编程101问题,我们通常不喜欢这里。@Zack:事实上,我不介意“编程101”问题,只要OP事先做了一些努力。(再说一次,如果他们确实付出了一些努力,他们可能不会首先问这些类型的问题。)
inline
不能保证函数是内联的。另外,OP说他的代码很长,所以我不建议你内联它。@Marlon是的,我知道,它只建议编译器内联它。它是完全安全的,因为如果编译器认为不内联它会更有效,它就不会了。@Rafer,没有更好的解决方案。这就是解决办法。嘎!(但如果您这样做,则在不完全是头的情况下,将include文件命名为
.i
比命名为
.h
更常见。)关于“Gack!”:绝对地但公平地说,这确实是我看到的唯一能够满足老年退休金需求的解决方案。将其转换为函数显然是“首选”的方式,但显然被OP尝试并拒绝。另一个可能有效的建议是将循环转换为宏,这将需要在行尾键入大量的“\”,此外,使不可理解的循环也几乎完全不可调试。(考虑到代码如此复杂以至于无法移动到函数中,这听起来不是一个好主意):我认为我的错误主要是因为将循环头定义为宏,而不是让include文件只包含正文……我认为这与将
.h
更改为
.I
一样重要,并且更新了代码以反映。
// ... 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
    // 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