gpt4 book ai didi

编译错误 C2059、C2061、C2146 和偶发的 IntelliSense 错误

转载 作者:太空宇宙 更新时间:2023-11-04 02:15:14 25 4
gpt4 key购买 nike

我在编译我的程序时遇到了一些问题,我认为现在的大部分问题是我已经研究它太久了......

程序的这部分概述:您有一个矩形形式的复数(由结构“Complex”表示),您想要将其转换为极坐标形式的复数(由结构“pComplex”表示)

在尝试构建时,我遇到了这些错误,每三次:

"error C2059: syntax error: ')'"  
"error C2059: syntax error: ';'"
"error C2061: syntax error: identifier 'c1'"
"error C2146: syntax error: missing ')' before identifier 'c1'"

此外,我收到 IntelliSense: identifier "Complex"is undefined 但只有在点击相关行后,它才会消失。

所有的错误都指向同一个头文件(pcomplex.h)的同一行:

pComplex NF_convert_c2_pcdouble(Complex c1);

pcomplex.h的相关部分:

#ifndef PCOMPLEX_H
#define PCOMPLEX_H
#include "complex.h"
#include <math.h>
//
// ...
//
typedef struct nf_complex_polar{
double r;
double angle;
} pComplex;
//
// ...
//
pComplex NF_convert_c2_pcdouble(Complex c1);
//
// ...
//
#endif

complex.h相关部分:

#ifndef COMPLEX_H
#define COMPLEX_H
#include "pcomplex.h"
#include <math.h>
//
// ...
//
typedef struct nf_complex{
double real;
double imag;
} Complex;
//
// ...
//
Complex NF_convert_pc2_cdouble(pComplex pc1);
//
// ...
//
#endif

当我将鼠标悬停在 pcomplex.c 中的函数名称上时,我注意到了其他事情,

pComplex NF_convert_c2_pcdouble(Complex c1)
{
//This function converts a rectangular form complex number c1
// and returns it as a polar form complex number pc1
pComplex pc1;
double x, y, r, a;
x = c1.real;
y = c1.imag;
r = sqrt( x*x + y*y );
a = atan2(y,x);
pc1.r = r;
pc1.angle = a;
return pc1;
}

我得到一个包含这个的小弹出框,我不知道第二行是什么意思:

pComplex NF_convert_c2_pcdouble(Complex c1)

pComplex NF_convert_c2_pcdouble(<error-type> c1)

这些信息和代码是否值得寻求帮助来解决这个问题?两个头文件各约 100 行,相应的源文件约 1000 行...所以我尽量保持相关性。

最佳答案

您定义了两种类型,ComplexpComplex,并声明了两个函数,每个函数都依赖于这两个类型定义。

无论您如何组织 #include 指令,编译器都需要查看两种类型定义,然后才能处理函数声明。

但是您有一个头文件定义了一种类型,然后声明了其中一个函数,还有另一个头文件定义了另一种类型,然后是另一个函数。编译 header 时没有任何顺序可以使类型定义在需要的地方可见。

(请注意,typedef 在 C 语法中的实现相当奇怪,结果是对尚未定义的 typedef 的引用通常显示为语法错误而不是更直接的“未声明的标识符”错误。)

一种解决方案是将类型定义和函数定义拆分为四个单独的头文件,使用 #include 指令来表达依赖关系。

一个更简单的解决方案是将您的两个头文件合并为一个,typedef 后跟函数声明。

正如 Basile 所说,让两个 header 相互包含几乎不是一个好主意。 include 守卫防止无限递归,但它们也防止某些声明对依赖于它们的代码可见。

关于编译错误 C2059、C2061、C2146 和偶发的 IntelliSense 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8776229/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com