在 C 中通过引用传递的 Cast 函数参数
Cast function argument passed by rereference in C
我有以下功能。它适用于 short
:
void foo (short n, short * res)
{
*res = n*2;
}
我想将结果存储在 double
变量中。例如:
short in = 5;
double out = 0;
foo(in,&out);
但是这样的结果是一些垃圾。有没有办法在这种情况下转换这些类型,或者唯一的解决方案是使用一些 short
?
类型的临时变量
如果你不能改变功能,那么我会这样做:
short in = 5;
short tmp;
double out;
foo(in,&tmp);
out = tmp;
如果你经常这样做,考虑像@einpoklum 在他的 中那样写一个包装器,如下所示:
void foo_wrapper(short n, double *out)
{
short tmp;
foo(n, &tmp);
out = tmp;
}
我想理论上可以通过转换实现,但我不建议这样做。做错的风险很高,你可能会遇到难以解决的错误,如果你进行显式转换,编译器不会给你警告。我写了一篇关于在 this answer
中投射的咆哮
在这种特殊情况下,请注意函数 foo
不知道结果类型。所以你需要一个临时变量。您可以通过使用 out
变量来摆脱它,因为它是自己的临时变量并进行了一些转换 但我强烈建议不要这样做!
short in = 5;
double out;
foo(in, (short*)&out);
out = *(short*)&out; // Evil! Avoid code like this!
printf("%f\n", out);
这在我的机器上有效,但它确实违反了@chqrlie 在评论中所写的别名规则。不要这样做!
@chqrlie 还写了一个替代方法,没有额外的变量,也没有邪恶的转换。它有效,但是啊!也不要这样做:
short in = 5;
foo(in, &in); // No! Just don't!
out = in;
当然如果你需要原始值就不行了,但这是很明显的。这里的主要缺陷是它非常糟糕。不要为了摆脱临时变量而将变量重复用于不同的目的。
除了@klutt 的有效 ,请记住,如果您多次这样做,将整个事情包装在一个函数中通常是个好主意:
int foo_d (short n, double * result)
{
short result_inner;
int retval = foo(n, &result_inner);
*result = (double) result_inner;
// Note to @Ans-lte: The explicit cast here isn't necessary,
// the conversion will happen anyway.
return retval;
}
使用转换不是个好主意。
对于初学者来说,不清楚为什么要使用浮点类型而不是整数类型,例如 int
或 long int
。
如果声明
*res = n*2;
可以为类型 short
的对象产生溢出,那么你应该重写函数
void foo (short n, int * res)
{
*res = n * 2;
}
请注意表达式 n * 2
的结果在您的原始函数中已经具有类型 int
。
如果问题与溢出无关那么为什么不写
short res;
foo( n, &res );
double d = res;
或者你需要像
一样重写函数
void foo (short n, double * res)
{
*res = n * 2.0;
}
但无论如何不要使用任何转换。
我有以下功能。它适用于 short
:
void foo (short n, short * res)
{
*res = n*2;
}
我想将结果存储在 double
变量中。例如:
short in = 5;
double out = 0;
foo(in,&out);
但是这样的结果是一些垃圾。有没有办法在这种情况下转换这些类型,或者唯一的解决方案是使用一些 short
?
如果你不能改变功能,那么我会这样做:
short in = 5;
short tmp;
double out;
foo(in,&tmp);
out = tmp;
如果你经常这样做,考虑像@einpoklum 在他的
void foo_wrapper(short n, double *out)
{
short tmp;
foo(n, &tmp);
out = tmp;
}
我想理论上可以通过转换实现,但我不建议这样做。做错的风险很高,你可能会遇到难以解决的错误,如果你进行显式转换,编译器不会给你警告。我写了一篇关于在 this answer
中投射的咆哮在这种特殊情况下,请注意函数 foo
不知道结果类型。所以你需要一个临时变量。您可以通过使用 out
变量来摆脱它,因为它是自己的临时变量并进行了一些转换 但我强烈建议不要这样做!
short in = 5;
double out;
foo(in, (short*)&out);
out = *(short*)&out; // Evil! Avoid code like this!
printf("%f\n", out);
这在我的机器上有效,但它确实违反了@chqrlie 在评论中所写的别名规则。不要这样做!
@chqrlie 还写了一个替代方法,没有额外的变量,也没有邪恶的转换。它有效,但是啊!也不要这样做:
short in = 5;
foo(in, &in); // No! Just don't!
out = in;
当然如果你需要原始值就不行了,但这是很明显的。这里的主要缺陷是它非常糟糕。不要为了摆脱临时变量而将变量重复用于不同的目的。
除了@klutt 的有效
int foo_d (short n, double * result)
{
short result_inner;
int retval = foo(n, &result_inner);
*result = (double) result_inner;
// Note to @Ans-lte: The explicit cast here isn't necessary,
// the conversion will happen anyway.
return retval;
}
使用转换不是个好主意。
对于初学者来说,不清楚为什么要使用浮点类型而不是整数类型,例如 int
或 long int
。
如果声明
*res = n*2;
可以为类型 short
的对象产生溢出,那么你应该重写函数
void foo (short n, int * res)
{
*res = n * 2;
}
请注意表达式 n * 2
的结果在您的原始函数中已经具有类型 int
。
如果问题与溢出无关那么为什么不写
short res;
foo( n, &res );
double d = res;
或者你需要像
一样重写函数void foo (short n, double * res)
{
*res = n * 2.0;
}
但无论如何不要使用任何转换。