包含C ++复数的端口C代码

时间:2014-03-18 14:57:07

标签: c++ c

以下代码在C中运行正常。 但是在C ++(std-C ++ 00)中,编译失败了。

#include <complex.h>

int main()
{ 
    float complex a = 0.0;
    return 0;
}

这是我面临的错误

Error: complex is not pat of 'std'
Error: expected ';' before a

我已经阅读了我面临的问题here的解决方案,而且我也知道std :: complex。

但我的问题是,我必须将大量的C代码移植到C ++中, 声明和使用复数的地方,如上所示。

那么有什么方法可以做到吗?

我还有其他选择吗?

3 个答案:

答案 0 :(得分:5)

#include <complex>

int main()
{
  // Both a and b will be initialized to 0 + 0i.
  std::complex<float> a; 
  std::complex<float> b = 0.0f;

  return 0;
}

答案 1 :(得分:2)

C ++中不支持C99复数语法,而C ++标准库中包含std::complex类型。你没有说出你移植代码的动机是什么,但你可以做一些不同的事情。

在C ++ 11中指定

std::complex与C99 complex布局兼容。早期版本的C ++的实现通常也会提供std::complex布局兼容性。您可以使用它来避免必须移植大部分代码。只需在C ++中声明C代码接口,就可以将C ++代码链接到C实现。

#include <complex.h>

#ifdef __cplusplus
extern "C" void foo(std::complex<float>);
#else
void foo(complex float);
#endif

您可能需要修改上面的实现。您必须确保两个声明之间的名称修改和调用约定都是一致的。

或者,有些编译器支持C ++中的C复杂语法作为扩展。当然,因为C complex宏会干扰std::complex宏未在C ++中定义,而您必须使用原始C关键字_Complex。或者,如果您不在任何地方使用std::complex并且您永远不会这样做,那么您可以自己定义宏:#define complex _Complex

#ifdef __cplusplus
#define complex _Complex
#else
#include <complex.h>
#endif

int main()
{ 
    float complex a = 0.0;
    return 0;
}

#define禁止使用C ++复杂标头。 (从技术上讲,如果您在所有标准库中使用它会导致未定义的行为,但只要您避开标题<complex><ccomplex><complex.h>它就可能没问题在实践中。


如果你确实需要将整个代码库移植到标准C ++,你可以考虑将它不是直接移植到惯用的C ++,而是移植到便携式的C ++。 C. I.e.编译为C和C ++的代码。这样,您可以在逐步移植它时继续构建为C,并验证它在整个移植过程中是否继续正常工作。

要执行此操作,您将执行将float complex替换为typedef,然后在每种语言中正确定义typedef,使用C标头<tgmath.h>,在C中定义其他宏来对应使用C ++复杂接口等

#include <complex.h>
#include <math.h>

#ifdef __cplusplus
using my_complex_type = std::complex<float>;
#else
#include <tgmath.h>
typedef float complex my_complex_type;
#define real creal
#define imag cimag
#endif
#define PRI_complex_elem "f"

void print_sine(my_complex_type x) {
    x = sin(x);
    printf("%" PRI_complex_elem "+%" PRI_complex_elem "i\n", real(x), imag(x));
}

答案 2 :(得分:1)

bames53的回答已被接受,非常有帮助。我无法添加评论,但我建议也许

void print_sine(my_complex_type x) {
    x = sin(x);
    printf("%" PRI_complex_elem "+%" PRI_complex_elem "i\n", real(x), imag(x));
}

应使用 csin (x)代替(x)。