同一函数上的不同参数类型

时间:2015-02-28 10:14:09

标签: c

我有一个十进制到八进制转换函数,并且想要使用int或unsigned int来调用它,具体取决于某些选项。我的第一个想法是复制/粘贴代码,只需更改参数的类型......有更好的方法吗?

2 个答案:

答案 0 :(得分:2)

您可以使用工会:

#include <stdio.h>

enum octal_type {AS_INT, AS_UINT};

typedef union {
    int as_int;
    unsigned as_uint;
} t_octal; 

void fn(t_octal value, enum octal_type type)
{
    switch (type) {
        case AS_INT:
            printf("%d\n", value.as_int);
            break;
        case AS_UINT:
            printf("%u\n", value.as_uint);
            break;
    }
}

int main(void)
{
    t_octal value;

    value.as_int = 5;
    fn(value, AS_INT);
    return 0;
}

或通用指针:

#include <stdio.h>

enum octal_type {AS_INT, AS_UINT};

void fn(const void *value, enum octal_type type)
{
    switch (type) {
        case AS_INT:
            printf("%d\n", *(int *)value);
            break;
        case AS_UINT:
            printf("%u\n", *(unsigned *)value);
            break;
    }
}

int main(void)
{
    int value = 5;

    fn(&value, AS_INT);
    return 0;
}

在C11下,您可以使用_Generic

忽略通话中的第二个参数
#include <stdio.h>

enum octal_type {AS_INT, AS_UINT};

#define fn(x) fn_impl(x, \
    _Generic(*x, signed int: AS_INT, unsigned int: AS_UINT, default: AS_INT))

void fn_impl(const void *value, enum octal_type type)
{
    switch (type) {
        case AS_INT:
            printf("%d\n", *(int *)value);
            break;
        case AS_UINT:
            printf("%u\n", *(unsigned *)value);
            break;
    }
}

int main(void)
{
    int value = 5;

    fn(&value);
    return 0;
}

答案 1 :(得分:1)

好吧,如果你需要在C中进行重载,你有三个选择。

  1. 实施VFT你的自我。有许多方法可以创建VFT并根据您的要求调用相应的函数。只需检查C中的OO
  2. 使用预处理器。您可以在预处理器中使用类型不可知的过程。但是,您必须对参数类型进行许多检查,或者应用也是类型不可知的过程。
  3. 使用参数为您提供案例。你可以有一个包含三个参数的包装函数;两个主要参数,可能是void指针类型,还有一个类型为string,enum,在预处理器中定义的类型或其他类似行为。根据后者,您将进行类型转换并将相应的函数称为自己。
  4. 或者......你可以使用struct / union(在像时尚这样的对象中)并根据它的特性来进行适当的计算。但我认为,对于你必须做的事情,最后一种方法将是更多的努力。实际上,所有人都会付出太多努力。我要做的是,将一个带有void指针的函数作为第一个参数,一个指向输出的指针和一个定义第一个参数类型的第三个参数。过程是相同的,但您有不同的限制,可能导致极值或负值溢出。因此,通过第三个参数,您将对第一个void指针进行类型转换并进行转换。