我有一个十进制到八进制转换函数,并且想要使用int或unsigned int来调用它,具体取决于某些选项。我的第一个想法是复制/粘贴代码,只需更改参数的类型......有更好的方法吗?
答案 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中进行重载,你有三个选择。
或者......你可以使用struct / union(在像时尚这样的对象中)并根据它的特性来进行适当的计算。但我认为,对于你必须做的事情,最后一种方法将是更多的努力。实际上,所有人都会付出太多努力。我要做的是,将一个带有void指针的函数作为第一个参数,一个指向输出的指针和一个定义第一个参数类型的第三个参数。过程是相同的,但您有不同的限制,可能导致极值或负值溢出。因此,通过第三个参数,您将对第一个void指针进行类型转换并进行转换。