我有以下文件:
main.c:
int f(void);
int main(void)
{
f();
return 0;
}
F.C:
char *f = "linker";
GNUMakefile:
CC = gcc
CFLAGS = -Wall -g
all: main
main: main.o f.o
main.o: main.c
f.o: f.c
clean:
rm -rf *.o main
运行makefile时,我没有收到编译警告/错误。为什么呢?
答案 0 :(得分:8)
因为你骗了编译器......它信任你。
在main.c中你告诉编译器f
是一个函数(声明/原型),但实际上f
是指向(不可修改的)的指针长度为7的字符数组,以fc( definition )定义。
不要欺骗编译器。
答案 1 :(得分:2)
你已经告诉编译器f是一个函数。它不是,但实施时没有义务记录此处需要警告的类型。 Gcc没有,其他一些实现可能会。
解决方法是将f的声明放入标题中,并将其包含在每个翻译单元中,这将使错误显而易见。
答案 2 :(得分:0)
如果你把声明int f(void);在两个文件中包含的头文件中,您将获得明确的编译器错误。在你目前的情况下,编译方式一切都很好。
在makefile中我错过了gcc main.c部分和ln部分