在 C 中通过重新引用传递的强制转换函数参数

ans*_*ans 1 c floating-point integer type-conversion function-definition

我有以下功能。它适用于short

void foo (short n, short * res)
{
  *res = n*2;
}
Run Code Online (Sandbox Code Playgroud)

我想将结果存储在double变量中。例如:

short in = 5;
double out = 0;
foo(in,&out);
Run Code Online (Sandbox Code Playgroud)

但这样的结果是一些垃圾。有没有办法在这种情况下强制转换这些类型,或者唯一的解决方案是使用一些类型的临时变量short

klu*_*utt 5

如果你不能改变功能,那么我会做这样的事情:

short in = 5;
short tmp;
double out;
foo(in,&tmp);
out = tmp;
Run Code Online (Sandbox Code Playgroud)

如果您经常这样做,请考虑像@einpoklum 在他的回答中所做的那样编写一个包装器,如下所示:

void foo_wrapper(short n, double *out)
{
    short tmp;
    foo(n, &tmp);
    out = tmp;
}
Run Code Online (Sandbox Code Playgroud)

我想理论上可以通过铸造实现,但我建议反对它。做错的风险很高,你可能会遇到难以追寻的错误,如果你进行显式转换,编译器不会给你警告。我在这个答案中写了一篇关于演员的咆哮

在这种特殊情况下,请注意该函数foo不知道结果类型。所以你需要一个临时变量。您可以通过使用out变量来摆脱它,因为它是自己的临时变量并进行了一些转换,但我强烈建议不要这样做!

short in = 5;
double out;
foo(in, (short*)&out);
out = *(short*)&out; // Evil! Avoid code like this!
printf("%f\n", out);
Run Code Online (Sandbox Code Playgroud)

这适用于我的机器,但它确实违反了@chqrlie 在评论中写的别名规则。不要这样做!

@chqrlie 还编写了一种替代方法,没有额外的变量,也没有邪恶的铸造。它有效,但是啊!也不要这样做:

short in = 5; 
foo(in, &in); // No! Just don't!
out = in;     
Run Code Online (Sandbox Code Playgroud)

当然,如果您需要原始值,它不会起作用,但这很明显。这里的主要缺陷是它很糟糕。不要为了不同的目的重用变量只是为了摆脱临时变量。