以下代码在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 ++中, 声明和使用复数的地方,如上所示。
那么有什么方法可以做到吗?
我还有其他选择吗?
答案 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
类型。你没有说出你移植代码的动机是什么,但你可以做一些不同的事情。
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)。