我正在为C班教学项目。该想法是使用在不同源文件中设置的函数并使用标头和makefile链接在一起的方法来创建mandelbrot集的可视化。我可以确认complex.c(如下)的100%正常工作,并且在编译时没有警告或错误。但是,对于这个项目,我已经将类型定义移到了头文件中,并且在main.c文件中有一个“虚构”类型的全局变量。该全局变量由我的mandelbrot.h头文件引用。
当我尝试使用我的makefile进行编译时,出现两个错误。这些错误是:
1. "error: unknown type name "img""
这是在我移动“ typedef struct {} img;”之后发生的到头文件。
2. Undeclared variable c referenced for first time at line <whatever> in mandelbrot.c
我在main.c中声明了img c,在mandelbrot.h中声明了extern img c。我不知道这是怎么回事,因为我们的教授更明确地说要在main.c中将变量声明为global,然后在mandelbrot.h中通过extern引用它,以便可以在mandelbrot.c中看到它。
我试图做到明确,因为如果我做错了事,我想跟踪并找到它(加上我们应该使用明确的makefile,而不要使用特殊变量,例如$(CC)等。)可执行文件是mandelbrot。
mandelbrot: main.o mandelbrot.o complex.o
gcc -o -Wall mandelbrot main.o mandelbrot.o complex.o
main.o: main.c complex.h mandelbrot.h
gcc -c main.c
mandelbrot.o: mandelbrot.c complex.h mandelbrot.h
gcc -c mandelbrot.c
complex.o: complex.h complex.c
gcc -c complex.c -lm
clean:
rm *.o
这是我的源代码(所有标头也包括我的函数原型,但我没有复制它们):
//complex.h
//Components of complex number.
typedef struct{
float r;
float j;
} img;
这是源文件:
//complex.c
#include <stdio.h>
#include <math.h>
img function(c){
//does something with the global variable c
}
我有第二个功能,它处理一些涉及mandelbrot集的检查。该函数位于单独的文件中,并且具有:
//mandelbrot.h
//Reference an external global variable.
extern img c;
和源文件:
//mandelbrot.c
#include "complex.h"
img mandelbrot(int n){
//Code that does stuff
if (absolute_value(c, n-1) > 1000000){
//does something
}
}
我有最后一个源文件:
//main.c
#include "mandelbrot.h"
#include "complex.h"
img c;
main(){
//does some stuff.
}
答案 0 :(得分:2)
可以通过将#include "complex.h"
(由C保留,使用其他方式)放置在mandelbrot.h
中来解决。
可以通过将#include "mandelbrot.h"
放在mandelbrot.c
内并从#include "complex.h"
和mandelbrot.c
中删除main.c
来解决。
#include "complex.h"
放在complex.c
中来固定。
-o -Wall mandelbrot
更改为-o mandelbrot -Wall
来修复。
您确实需要开始使用标题保护。