将 C++11 和 C 库一起用于复数

Soo*_*Soo 3 c compiler-errors c++11

我想在我的应用程序中使用 C 库和 C++11 库。C 和 C++11 库中“复杂”的用法似乎发生冲突,并产生编译错误。此处给出了 MWE。

myLib_C.h 的内容:

#ifndef MYLIBC_H
#define MYLIBC_H
#include <math.h>
#include <complex.h>
#ifdef  __cplusplus
extern "C" {
#endif
typedef float complex cfloat;
typedef double complex cdouble;
#define myFunc_cfloat(r,i) ((float)(r) + ((float)(i))*I)
#define myFunc_cdouble(r,i) ((double)(r) + ((double)(i))*I)
#ifdef __cplusplus
} // extern "C"
#endif
#endif
Run Code Online (Sandbox Code Playgroud)

myLib_CPP.h 的内容:

#ifndef MYLIBCPP_H
#define MYLIBCPP_H

#include "myLib_C.h" //uses myLib_C somewhere in this file
#include <iostream>
#include <complex>
inline void CppFunction()
{
    std::cout<<"This file need to be compiled using C++11\n";
    std::complex<float> a(10,100);
    std::complex<float> b(1, 1);
    auto c = a+b;
    std::cout<<"c= "<<c<<std::endl;
}

#endif // MYLIBCPP_H
Run Code Online (Sandbox Code Playgroud)

我的 main.cpp:

#include "myLib_C.h"
#include "myLib_CPP.h"
#include <iostream>
#include <complex>
int main()
{
    std::cout<<"Hello World\n";
    CppFunction();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

CMakeLists.txt 的内容:

cmake_minimum_required(VERSION 3.10)
project(myTest)
set(CMAKE_CXX_FLAGS "-std=c++11")
add_executable(myTest main.cpp)
Run Code Online (Sandbox Code Playgroud)

当我编译时,我收到以下错误:

error: expected initializer before ‘cfloat’
     typedef float complex cfloat;
Run Code Online (Sandbox Code Playgroud)

在 C++中的C 复数中讨论了类似的问题. 那里提到的解决方案是替换complex_Complex. 在我的情况下这是不可能的,因为我将无法编辑 C 和 C++ 库。

n. *_* m. 5

extern "C" { ... } 不会神奇地将大括号内的 C 代码转换为有效的 C++ 代码,所以这已经过时了。

两种语言标准都要求它们各自的复数与相应浮点类型的两个数字的数组具有相同的布局(即 C++std::complex<float>和 C 的float complex行为就像float[2],布局方面一样)。你可以利用这一点。例如:

#ifdef  __cplusplus
   using cfloat = std::complex<float>;
#else
   typedef float complex cfloat;
#endif
Run Code Online (Sandbox Code Playgroud)

现在您可以cfloat用一种语言声明一个变量并将其传递给另一种语言,这应该可以工作。