Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 端口C代码,包含到C++;_C++_C - Fatal编程技术网

C++ 端口C代码,包含到C++;

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>

下面的代码在C中运行良好。 但是在C++(STD C++ 00)中编译失败。
#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编译器是完全合理的