我在编写程序时遇到了一些麻烦,我认为现在的大部分问题是我已经看了太长时间......
该程序的一个部分概述:您有一个矩形形式的复数(由结构“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行......所以我试着让它保持相关性。
答案 0 :(得分:2)
您定义了两种类型Complex
和pComplex
,并声明了两个函数,每个函数都取决于两种类型定义。
但是,在组织#include
指令时,编译器需要先查看两个类型定义,然后才能处理函数声明。
但是你有一个标题定义了其中一个类型,然后声明了其中一个函数,另一个标题定义了另一个类型,后跟另一个函数。没有顺序可以编译标题,使类型定义在需要的位置可见。
(请注意,typedef
在C的语法中实现得比较奇怪,结果是对typedef
的引用尚未定义,通常会显示为语法错误,而不是一个更直接的“未声明的标识符”错误。)
一种解决方案是将类型定义和函数定义拆分为四个单独的头文件,使用#include
指令来表示依赖关系。
一个更简单的解决方案是将两个头文件合并为一个,typedef
后跟函数声明。
正如Basile所说,有两个标题相互包含很少,如果一个好主意。包含防护可以防止无限递归,但它们也会阻止某些声明对依赖于它们的代码可见。
答案 1 :(得分:1)
您使用C语言编写还是使用C ++编写代码?如果用C ++编码,定义类 -es应该是更好的样式。
让pcomplex.h
和complex.h
相互包含是一个糟糕的设计。包含图应为DAG。
我建议将两个标头合并为一个包含CartesianComplex
和PolarComplex
类型的标头。
(我想你的老师不希望你使用定义复杂数字的标准标题)