无法识别类型(双复合体)

标签 c visual-studio-code

VS 代码窗口

使用变量定义 C 方法(不是 C++)时发生错误

双复数*a_t

但是,VS Code 无法识别双复数类型。相反,系统将 double 识别为类型,将complex 仅识别为变量名称。

enter image description here

如何解决这个问题?难道是因为系统自动以C++为主要工具,使用complexXXX定义复数?

问题更新

我曾经在 Linux 中的 VSCode 上进行编码,并且使用一个名为 libcint 的库。

最近,我打算将其移动并编码到我的Windows系统中,但是VSCode报告它无法识别所有double complex XXX的函数变量,看来系统识别complex 作为 double 类型的变量,而不是将 double complex 解释为可用类型。

我尝试检查我的复杂头文件,发现没有关于complex的定义。我想把函数变量修改为double _Complex,这样就可以成功识别了,于是我在库的主头文件中添加了#define complex _Complex。但是,一些函数(如 conj())因此无法调用,因为在此复杂文件中,该函数需要类型 _Dcomplex

所有的函数和编译过程都在linux中传递(见下面的编译过程)。比较了两个不同的 后,我怀​​疑它们使用的是不同的复杂文件——Windows 引入了 Microsoft 复杂文件,而 linux 使用的是 ISO C99。

在我的linux系统中,这个声明显示在

 /*
 *  ISO C99:  7.3 Complex arithmetic    <complex.h>
 */

然后我尝试在 libcint 的 CMakeList 中添加 #set(CMAKE_C_FLAGS "std=c99")set(CMAKE_C_FLAGS "${CMAKE_ENABLE_C99}") ,但仍然不起作用.

编译过程

关于编译,我按照https://github.com/sunqm/libcint上的说明进行操作,它使用

cmake -DCMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR>
make install

完成编译过程。

到目前为止

检查评论框和 Microsoft Specify Language Standard Version 后,我怀疑VSCode的插件不支持ISO C99标准,但是我仍然可以在cmd中通过gcc编译它,这样正确吗?

最佳答案

而 MSVC 则 support the <complex.h> header ,其实现在内部使用 struct,因此不符合标准 C。

如果您需要在同一代码库中同时支持兼容编译器和 MSVC,则可以使用宏和 typedef 来扩展为标准类型和函数或 MSVC 的类型和函数。您还需要编写函数(这将是兼容编译器上的简单包装器)来处理标准 + - */ 运算符。

值得庆幸的是,大多数 MSVC 函数的名称都与 standard C ones 相同。 ,例如cabs()creal()ctan()...但是,您将无法使用 + - */ 上的复数(因为这些不是 MSVC 上的 native 类型),您需要自行编写,但 * 除外,它以 _Cmulcc() 形式提供>。还有一个 MSVC 相当于 C11 CMPLX , _Cbuild ,从实部和虚部构造复数。

这是一个最小的示例,它将两个复数相加并打印结果。它可以在最新版本的 MSVC、GCC 和 Clang 上成功编译并运行:

#include <stdio.h>
#include <complex.h>

#ifdef _MSC_VER // using Microsoft's implementation:

// there is also _Fcomplex for float complex and _Lcomplex for long double complex
typedef _Dcomplex double_complex;
#define mk_dbl_cmplx _Cbuild

// we need this on MSVC since it does not support the '+' operator:
double_complex add_dbl_cmplx (double_complex a, double_complex b)
{
    return mk_dbl_cmplx(creal(a) + creal(b), cimag(a) + cimag(b));
}

#else // using standard C:

typedef double complex double_complex;
#define mk_dbl_cmplx CMPLX

// on a compliant compiler, it is a simple wrapper around the + operator:
double_complex add_dbl_cmplx (double_complex a, double_complex b)
{
    return a + b;
}

#endif


char *sprint_complex (char *str, double_complex x)
{
    sprintf(str, "%g + %g * i", creal(x), cimag(x));
    return str;
}

int main (void)
{
    double_complex a = mk_dbl_cmplx(3, -7);
    double_complex b = mk_dbl_cmplx(2, 5);

    double_complex c = add_dbl_cmplx(a, b);

    printf("(%s) + (%s) = (%s)",
        sprint_complex((char[32]){""}, a),
        sprint_complex((char[32]){""}, b),
        sprint_complex((char[32]){""}, c)
    );
}

使用 MSVC、GCC 或 Clang 编译,应输出:

(3 + -7 * i) + (2 + 5 * i) = (5 + -2 * i)

关于无法识别类型(双复合体),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68934065/

相关文章:

C 解析/proc/stat 以计算每个核心的当前 CPU 使用率

c - 类型转换,对于擅长C的人来说很容易的问题

c - mmap() 用于共享内存和线程

python - 通过vscode的SSH隧道打开Matplotlib图

visual-studio-code - VSCode 扩展 createTextEditorDecorationType 忽略空格

c - 从 C 函数中的数组返回一个项目

c - `*p=&` 和 `p=&` 之间的区别

python - 写 Python 时在 VSCode 中使用制表符而不是空格?

typescript - VScode导入文件夹时找不到模块

python - Visual Studio Code 的 Mac OS Mojave 麦克风权限