头文件中通常包含有:函数原型(声明)、宏定义、内联函数定义。
头文件使用#include宏命令引入。有两种形式:#inlcude <header.h>和#include “header.h”. 两种形式的区别在于预处理器(preprocessor)查找头文件的方式的不同:对于前者,预处理器仅在系统预定义的标准路径中查找(标准查找路径由环境变量指明),比如/usr/include, /usr/local/include;对于后者,预处理器首先查找(源文件所在的)当前目录,若未找到,则到标准路径查找。另外,查找路径还可以通过编译器选项(-I for gcc)指定。通常,对于C/C++标准库和其他系统范围的程序库,使用<>形式,对于程序本身定义的头文件,采用”"形式。
编译器在传递参数给函数时,依据的是该函数的原型。因此,在调用外部函数时,务必包含其对应的头文件,否则,可能会出现传递的参数与函数实际使用的参数格式不一致的情况。瞧,
1 2 3 4 5 6 7 8 9 10 11 12 13 | //~ foo.c float foo(float f) { return f * f; } //~ main.c int main() { double d = foo(3.1415926); return 0; } |
独立编译,
1 2 3 | $ cc foo.c main.c -c $ cc foo.o main.o -omain $ ./main |
你执行上面程序可能没发现什么问题,但在某些情况下,问题就来了。比如,如果编译器只使用栈来传递浮点数,main中向foo传递的是double(通常浮点字面常量被编译器解释为double),foo却按float处理参数,结果可想而知了。
对于内联函数(内联展开只是对编译器的建议),由于编译器在进行内联展开时需要看到函数的定义(而不仅仅是原
型),所以,内联函数通常直接在头文件中声明和定义。如果把内联函数的定义同其他
函数一样,将声明和定义分开(在单独的源文件中定义),那么该“内联”函数就只能在其所定义的文件中展开。
你好!除了代码,此处没有多少原创之物,皆为本人搜集、整理、总结之记录与心得,欢迎转载分享!转载时请尽量注明出处,将不胜感激。祝你健康、快乐!
Be the first to comment on this entry.