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

时间:2012-01-08 08:13:02

标签: c visual-c++

我在编写程序时遇到了一些麻烦,我认为现在的大部分问题是我已经看了太长时间......

该程序的一个部分概述:您有一个矩形形式的复数(由结构“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行......所以我试着让它保持相关性。

2 个答案:

答案 0 :(得分:2)

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

但是,在组织#include指令时,编译器需要先查看两个类型定义,然后才能处理函数声明。

但是你有一个标题定义了其中一个类型,然后声明了其中一个函数,另一个标题定义了另一个类型,后跟另一个函数。没有顺序可以编译标题,使类型定义在需要的位置可见。

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

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

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

正如Basile所说,有两个标题相互包含很少,如果一个好主意。包含防护可以防止无限递归,但它们也会阻止某些声明对依赖于它们的代码可见。

答案 1 :(得分:1)

您使用C语言编写还是使用C ++编写代码?如果用C ++编码,定义 -es应该是更好的样式。

pcomplex.hcomplex.h相互包含是一个糟糕的设计。包含图应为DAG

我建议将两个标头合并为一个包含CartesianComplexPolarComplex类型的标头。

(我想你的老师不希望你使用定义复杂数字的标准标题)