C链接阶段不会产生警告

时间:2012-03-07 16:25:05

标签: c linux gcc linker

我有以下文件:

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时,我没有收到编译警告/错误。为什么呢?

3 个答案:

答案 0 :(得分:8)

因为你骗了编译器......它信任你。

在main.c中你告诉编译器f是一个函数(声明/原型),但实际上f是指向(不可修改的)的指针长度为7的字符数组,以fc( definition )定义。

不要欺骗编译器。

答案 1 :(得分:2)

你已经告诉编译器f是一个函数。它不是,但实施时没有义务记录此处需要警告的类型。 Gcc没有,其他一些实现可能会。

解决方法是将f的声明放入标题中,并将其包含在每个翻译单元中,这将使错误显而易见。

答案 2 :(得分:0)

如果你把声明int f(void);在两个文件中包含的头文件中,您将获得明确的编译器错误。在你目前的情况下,编译方式一切都很好。

在makefile中我错过了gcc main.c部分和ln部分