VS 代码窗口
使用变量定义 C 方法(不是 C++)时发生错误
双复数*a_t
。
但是,VS Code 无法识别双复数类型。相反,系统将 double 识别为类型,将complex 仅识别为变量名称。
如何解决这个问题?难道是因为系统自动以C++为主要工具,使用complex
问题更新
我曾经在 Linux 中的 VSCode 上进行编码,并且使用一个名为 libcint 的库。
最近,我打算将其移动并编码到我的Windows系统中,但是VSCode报告它无法识别所有double complex XXX
的函数变量,看来系统识别complex
作为 double
类型的变量,而不是将 double complex
解释为可用类型。
我尝试检查我的复杂头文件complex
的定义。我想把函数变量修改为double _Complex
,这样就可以成功识别了,于是我在库的主头文件中添加了#define complex _Complex
。但是,一些函数(如 conj()
)因此无法调用,因为在此复杂文件中,该函数需要类型 _Dcomplex
。
所有的函数和编译过程都在linux中传递(见下面的编译过程)。比较了两个不同的
在我的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/