linux GCC编译C程序的问题
今天下午突然觉得C里面有个地方比较模糊,一种莫名的恐惧产生,如是做两个实验
有三个文件hello.c , hello.h, main.c
代码如下:
文件hello.h
#include<stdio.h>
int sayhello(char* str)
{
printf("%s \n",str);
return 0;
}
这个里面申明并定义了一个函数sayhello
文件hello.c
#include<stdio.h>
int sayhello(char* str)
{
printf("%s \n",str);
return 0;
}
内容和hello.h一样,也是定一个函数sayhello
文件main.c
#include<stdio.h>
#include"hello.h"
int main(void)
{
char * str="hello";
sayhello(str);
return 0;
}
下面是编译测试(一):guoyuanwei@ubuntu:~/文档$ gcc -Wall main.c hello.c -o hello
main.c: In function ‘main’:
main.c:5: warning: implicit declaration of function ‘sayhello’
显示1个警告,隐式定义了函数sayhello,但能正确运行。
测试(二):guoyuanwei@ubuntu:~/文档$ gcc -Wall main.c hello.h -o hello
main.c: In function ‘main’:
main.c:5: warning: implicit declaration of function ‘sayhello’
/tmp/cc3NGyXC.o: In function `main':
main.c:(.text+0x1d): undefined reference to `sayhello'
collect2: ld returned 1 exit status
有个错误,意思是main.c中的函数sayhello没有定义,但是hello.h和hello.c的内容所完全一样的,实验一中却没有,这是为什么?
测试(三):首先将main.c文件改为:也就是加上一个头文件。
#include<stdio.h>
#include"hello.h"
int main(void)
{
char * str="hello";
sayhello(str);
return 0;
}
编译:guoyuanwei@ubuntu:~/文档$ gcc -Wall main.c -o hello
一个错误和警告都没有,这是因为GCC在编译C源文件的时候,会根据#include包含相应的内容进来
但是实验一、二就比较诡异了,难道GCC编译的时候,对hello.h和hello.c处理方式不一样?自动抛弃了hello.h文件,是不是只要.h的头文件都不会编译进来。GCC编译文件的时候难道看的是文件的后缀名而不是文件的内容吗?