我想写几个只在参数类型上有所不同的函数.我知道C++必须template很好地处理这个问题(虽然很少,但很少有编译器支持export关键字,并且查询此关键字的效率).举个简单的例子,我想:
template <typename T>
T add(T a, T b){
return a+b;
}
Run Code Online (Sandbox Code Playgroud)
但是,在纯C中(有时我必须选择纯C,因为某些平台没有C++编译器),不同版本的函数名称必须不同,如
double addDouble(double a, double b){
return a+b;
}
int addInt(int a, int b){
return a+b;
}
Run Code Online (Sandbox Code Playgroud)
嗯,当有两个版本时,我可以在源文件中进行复制和粘贴工作; 但是,实际上会有很多行而不是return函数中的一个语句,而且会有更多的版本.那么,我的问题是,如何优雅地实现不同类型版本的一系列功能?
到目前为止,我已经尝试了一些解决方案,但我认为它们远非好.我需要你的建议,谢谢!
解决方案1:
#define mytype int
mytype addInt(mytype a, mytype b){
return a+b;
}
#undef mytype
#define mytype float
mytype addFloat(mytype a, mytype b){
return a+b;
}
#undef mytype
Run Code Online (Sandbox Code Playgroud)
解决方案1的缺点:重复的内容太多,如果我想修改该功能,我必须修改所有版本.
解决方案2:
func.h
#ifndef FUNC_H
#define FUNC_H
#define add(a, b, typename) functionAdd##typename(a,b)
/* …Run Code Online (Sandbox Code Playgroud) 我正在尝试用C编写一个函数来解决数学问题.在该函数中,有几个步骤,每个步骤需要根据前面步骤中的计算结果分配一些大小的内存(所以我不能在函数的开头全部分配它们).伪代码看起来像:
int func(){
int *p1, *p2, *p3, *p4;
...
p1 = malloc(...);
if(!p1){
return -1; //fail in step 1
}
...
p2 = malloc(...);
if(!p2){
free(p1);
return -2; //fail in step 2
}
...
p3 = malloc(...);
if(!p3){
free(p1);
free(p2);
return -3; //fail in step 3
}
...
p4 = malloc(...);
if(!p4){
free(p1);
free(p2);
free(p3); /* I have to write too many "free"s here! */
return -4; //fail in step 4
}
...
free(p1);
free(p2);
free(p3);
free(p4);
return 0; //normal …Run Code Online (Sandbox Code Playgroud)