在 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;
}

使用转换不是个好主意。

对于初学者来说,不清楚为什么要使用浮点类型而不是整数类型,例如 intlong 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;
}

但无论如何不要使用任何转换。