【发布时间】:2010-11-06 23:56:18
【问题描述】:
我想使用 C99 中定义的复数,但我需要支持不支持它的编译器(想到的是 MS 编译器)。
我不需要很多函数,在没有支持的编译器上实现所需的函数并不太难。但是我很难实现“类型”本身。理想情况下,我想做这样的事情:
#ifndef HAVE_CREAL
double creal(complex z)
{
/* .... */
}
#endif
#ifndef HAVE_CREALF
float creal(float complex z)
{
/* ... */
}
#endif
但如果编译器无法识别“浮点数复数”,我不确定我是否知道如何执行此操作。我实际上认为这是不可能的,但Dinkumware 的 C 库似乎另有说明。解决办法是什么 ?我不介意使用函数/宏对类型进行操作,但我需要一种方法来为复数赋值,并以与 C99 兼容的方式取回其实部/虚部。
解决方案
我最终做了这样的事情:
#ifdef USE_C99_COMPLEX
#include <complex.h>
typedef complex my_complex;
#else
typedef struct {
double x, y;
} my_complex;
#endif
/*
* Those unions are used to convert a pointer of my_complex to native C99
* complex or our own complex type indenpendently on whether C99 complex
* support is available
*/
#ifdef USE_C99_COMPLEX
typedef union {
my_complex my_z;
complex c99_z;
} __complex_to_c99_cast;
#else
typedef union {
my_complex my_z;
my_complex c99_z;
} __complex_to_c99_cast;
#endif
为类型定义,如下定义一组复杂函数:
#ifndef HAVE_CREAL
double my_creal(my_complex z)
{
union {
my_complex z;
double a[2];
} z1;
z1.z = z;
return z1.a[0];
}
#endif
#ifdef HAVE_CREAL
my_complex my_creal(ny_complex z)
{
__complex_to_c99_cast z1;
__complex_to_c99_cast ret;
z1.my_z = z;
ret.c99_z = creal(z1.c99_z);
return ret.npy_z;
}
#endif
这有点复杂,但这使我能够在可用时轻松重用 C lib 函数,并且可以通过代码生成器部分自动化。
【问题讨论】:
标签: c visual-studio c99 complex-numbers