小编Sta*_*tan的帖子

如何使用纯C优雅地实现不同类型版本的一系列功能?

我想写几个只在参数类型上有所不同的函数.我知道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 coding-style

9
推荐指数
1
解决办法
507
查看次数

有没有其他方法来处理许多'malloc'失败?

我正在尝试用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)

c malloc

5
推荐指数
3
解决办法
432
查看次数

标签 统计

c ×2

coding-style ×1

malloc ×1