C++ 端口C代码,包含到C++;
下面的代码在C中运行良好。 但是在C++(STD C++ 00)中编译失败。C++ 端口C代码,包含到C++;,c++,c,C++,C,下面的代码在C中运行良好。 但是在C++(STD C++ 00)中编译失败。 #include <complex.h> int main() { float complex a = 0.0; return 0; } 我已经阅读了我面临的问题的解决方案,我也意识到std::complex 但是我的问题是,我必须把大量的C代码移植到C++, 其中声明并使用复数,如上所示 那有什么办法吗 我还有什么其他选择?#包括 #include <complex>
#include <complex.h>
int main()
{
float complex a = 0.0;
return 0;
}
我已经阅读了我面临的问题的解决方案,我也意识到std::complex
但是我的问题是,我必须把大量的C代码移植到C++,
其中声明并使用复数,如上所示
那有什么办法吗
我还有什么其他选择?#包括
#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;
}
int main()
{
//a和b都将初始化为0+0i。
std::复合物a;
标准:复合物b=0.0f;
返回0;
}
#包括
int main()
{
//a和b都将初始化为0+0i。
std::复合物a;
标准:复合物b=0.0f;
返回0;
}
复数语法在C++中不支持,它在C++标准库中包含了类型<代码> STD::您没有说移植代码的动机是什么,但是您可以做一些不同的事情
std::complex
在C++11中指定与C99的complex
布局兼容。C++早期版本的实现通常提供<>代码> STD::复合< /代码>布局兼容性。您可以使用它来避免移植大部分代码。在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++,你可以考虑将它直接移植到惯用的C++,而不是将它移植到“可移植”的C中,即编译成C和AS C++的代码。这样,你可以继续构建C,同时递增地传送它,并验证它在整个移植过程中都能正常工作。过程
这样,您将用TyPulf做替换“代码>浮点复合体< /代码>,然后在每种语言中适当地定义TyPulf,使用C标题<代码> <代码>,定义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));
}
#包括
#包括
#ifdef_uucplusplus
使用my_complex_type=std::complex;
#否则
#包括
typedef float complex my_complex_type;
#定义真正的creal
#定义imag cimag
#恩迪夫
#定义PRI_complex_elem“f”
无效打印(我的复杂类型x){
x=sin(x);
printf(“%”PRI_complex_elem“+%”PRI_complex_elem“i\n”,实(x),imag(x));
}
< C>复数语法不支持C++,它在C++标准库中包含类型<代码> STD::复数< /COD>。您不知道移植代码的动机是什么,但可能有不同的事情可以做。
<> >代码> STD::复杂的在C++ 11中被指定为与C99的代码>复合体< /代码>兼容。C++的早期版本的实现通常提供<>代码> STD::复杂< /COD>布局兼容性。您可以使用它避免必须在大多数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++,而不是将它移植到“可移植”的C中,即编译成C和AS C++的代码。这样,你可以继续构建C,同时递增地传送它,并验证它在整个移植过程中都能正常工作。过程
这样,您将用TyPulf做替换“代码>浮点复合体< /代码>,然后在每种语言中适当地定义TyPulf,使用C标题<代码> <代码>,定义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));
}
#包括
#包括
#ifdef_uucplusplus
使用my_complex_type=std::complex;
#否则
#包括
typedef float complex my_complex_type;
#定义真正的creal
#定义imag cimag
#恩迪夫
#定义PRI_complex_elem“f”
无效打印(我的复杂类型x){
x=sin(x);
printf(“%”PRI_complex_elem“+%”PRI_complex_elem“i\n”,实(x),imag(x));
}
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)代替sin(x)。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)代替sin(x).C++00
?我不确定问题出在哪里,因为您知道std::complex
sed's/float complex/std::complex/g'
@Beagle Bone-我认为不是。操作的拼写会有所不同,例如使用操作符重载。您在C中使用的complex
类型是C标准的一部分吗?那个错误看起来很奇怪(拼写错误也很奇怪-请尽可能剪切和粘贴),并检查这是您发布的实际代码的错误。如果您的代码有std::complex
(并且您没有包含正确的标题-
与
不同,那么不是std
的一部分的错误就有意义了,但如果你指的是complex
,而没有提到std
,那就没有意义了。是否绝对有必要“将大量的C代码移植到C++”?只为旧版本使用C编译器是完全合理的