1.头文件
其实我们刚才这段代码当中,有一个小细节.在我们的main.c里头,我们保留了max的原型声明.也就是说,我们的编译器知道我们在main.c中对函数的调用是正确的.
如果我们把这个函数的原型声明注释掉,结果会怎么样呢.编译没有任何问题,运行得到得结果而是正确的.因为我们之前说过,如果编译器没有看到这个原型声明,编译器会猜这里面的两个参数为int,这是c语言的一种古老的传统.
假如我们把现在max.c里头的函数参数的类型换成double,我们把返回类型也改成double,这个时候我们再来编译他,仍然是通过的,没有任何错误.但你想这里头其实是有问题的.因为我们的a和b给的都是int,我们以为max返回的是int,然后我们用了%d.
运行得到结果:
我们得到了一个奇怪的数字,这是为什么?
我们的max和main在各自编译完成之后,然后链接器把他们链接起来的时候,链接器在printf链到那个max函数.这没有问题.它确实链到了正确的max函数,可是传进去的东西错了.传出来的东西也是错的.那怎么能够保证说,我在main这边对max的使用和在max这边,它所定义的那个max是一致的呢.我们需要有一个中间的媒介.这个中间的媒介就是头文件.以点h结尾的一个头文件.我们把max.c的原型放到.h文件里头,然后在需要用到max的地方,我们去引用他.怎么做呢?
我们需要新建一个源代码文件,把在main里的函数原型注释掉,然后再在新文件复制函数原型,保存为max.h.最后我们再在main里用""包含这个头文件.我们编译一下,发现不通过了.因为我们在max.c的函数原型没有改.
2.<>还是""
所以一般来说,你自己的头文件你要用"",而系统给的标准库的你用<>.当然这个系统指定的目录在哪呢,一般来说,现在的编译器,它自己知道它的那个标准头文件在哪.
3#include的误区
第三点,如果我们没有i包含stdlib.h,malloc函数好像也能用,虽然编译的时候给了几句warning,但是也运行成功得到正确结果了,为什么?就是因为malloc的代码并不在那个.h里头,它里面只有malloc的原型.所以当malloc的原型不在(你没有include那个头文件),编译器会猜输入和返回是int,而刚好它的输入是一个size_t,返回是一个指针,这两个都能看做int,所以你就对了,只是因为这个缘故.
这个做法不包含main.c.