【发布时间】:2019-04-08 06:32:25
【问题描述】:
这是我的代码:
#include <stdio.h>
#include <tgmath.h>
double complex execmathfunc(double complex val, double complex (*mathfunc)(double complex))
{
return mathfunc(val);
}
int main()
{
double complex val = -1;
val = execmathfunc(val, sqrt); //if I put csqrt here it works
printf("%.1f+%.1fi", creal(val), cimag(val));
return 0;
}
如果我使用csqrt,此代码有效,并且将按预期输出0.0+1.0i,但如果我使用常规sqrt(寄希望于tgmath.h 的类型通用函数),它会输出垃圾实部取值为 0,虚部取值为 0。有什么办法可以解决这个问题,还是在将 csqrt 和所有其他复杂函数作为参数传递时,我需要坚持使用它们吗?
我相信代码的行为方式是这样的,因为 tgmath 函数是作为函数宏实现的,并且只有在名称后跟 () 时才会扩展。
【问题讨论】:
-
一般来说,函数指针必须与它所指向的函数具有完全相同的类型。否则,参数和结果将被查找/放入错误的位置。
-
是的,但是 tgmath 应该通过它的参数选择正确的函数,就像 C++ 重载一样,不是吗?
-
@DarkAtom tgmath 使用
_Generic宏。您不能指向宏。 -
有趣的编码目标,但不可能。如果高级别目标已知,则存在替代方案。
标签: c