我有很多非常相似的功能,例如
void someLargeFulction1(args)
{
IDENTICAL CODE
DIFFERENT CODE 1
IDENTICAL CODE
}
//---------------------------//
//---------------------------//
void someLargeFulctionN(args)
{
IDENTICAL CODE
DIFFERENT CODE N
IDENTICAL CODE
}
所有这些功能仅在DIFFERENT CODE N
部分有所不同(这是一系列浮点运算)。由于大多数someLargeFulctionN
代码是相同的,因此我不会避免代码复制,因为这会使代码维护变得非常复杂。减少销售代表是我的主要目标。不幸的是,由于对性能的严重影响,我无法将DIFFERENT CODE
组织为函数调用,并且不能将此函数作为someLargeFulction
参数传递-DIFFERENT CODE
的执行速度比典型的函数调用快得多,由编译器调用内联。我不想将someLargeFulctionN
组织为宏定义(但是这可能是解决方案)。
在C ++编程语言中,我有一个非常简单且有用的解决方案-模板函数。我可以做类似的事情:
template <int N>
void someLargeFulction(args)
{
IDENTICAL CODE
differentCode<N>();
IDENTICAL CODE
}
并针对所有变体专门化differentCode()函数。对于所有经过测试的编译器(g ++,MVSC),它都很棒!编译器总是内联differentCode
调用,并且我有必要数量的someLargeFulction
变体。问题是,现在我需要将此代码移植到С98。为了直接解决问题,我需要创建完整数量的someLargeFulction
副本,这是一个错误的决定。将宏定义与someLargeFulction
实现一起使用是可以接受的,但并不可取。您还会看到其他什么选择?
答案 0 :(得分:0)
类似的东西:
#include <stdio.h>
#define doIt(OP,a,b) do##OP(a,b)
#define performTmpl(OP,a,b,c) { for (int i=0; i<10; i++) a[i]=doIt(OP,b[i],c[i]); }
enum { ADD, SUB };
int doADD(int a,int b) { return a+b; }
int doSUB(int a,int b) { return a-b; }
int main() {
printf("%d\n",doIt(ADD,5,4));
printf("%d\n",doIt(SUB,5,4));
int x[10], y[10]={1,2,3,4,5,6,7,8,9,10}, z[10]={1,1,1,1,1,1,1,1,1,1};
performTmpl(ADD,x,y,z);
for (int i=0; i<10; i++) printf("%d\n",x[i]);
}