头文件中通常包含有:函数原型(声明)、宏定义、内联函数定义。
  头文件使用#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处理参数,结果可想而知了。

  对于内联函数(内联展开只是对编译器的建议),由于编译器在进行内联展开时需要看到函数的定义(而不仅仅是原
型),所以,内联函数通常直接在头文件中声明和定义。如果把内联函数的定义同其他
函数一样,将声明和定义分开(在单独的源文件中定义),那么该“内联”函数就只能在其所定义的文件中展开。

Tags: ,.
你好!除了代码,此处没有多少原创之物,皆为本人搜集、整理、总结之记录与心得,欢迎转载分享!转载时请尽量注明出处,将不胜感激。祝你健康、快乐!
Home

Be the first to comment on this entry.

Name(required)
Mail (required),(will not be published)

RFC: Request For Comments. Orz..

Website(recommended)