创建第一个头文件
为了创建头文件,只要做两件事:
- 创建一个扩展名为.h 的文件。
如果程序叫
totaller ,就创建一个叫 totaller.h 的文件,并把你的声明写在里面:
不用在头文件中包含 main() 函数,反正也没有函数会调用它。
在主代码中包含头文件。
应该在代码的顶部加一句
include :
头文件的名字用双引号括起来,而不是尖括号,它们的区别是什么?当编译器看到尖括号,就会到标准库代码所在目录查找头文件,但现在你的头文件和.c 文件在同一目录下,用引号把文件名括起来,编译器就会在本地查找文件。
当编译器在代码中读到#include ,就会读取头文件中的内容,仿佛它们本来就在代码中。
把声明放到一个独立的头文件中有两大优点,第一是主代码变短了,第二个优点你会在几页之后看到。
先来看看头文件能否解决眼前的问题。
试驾
当编译代码时,结果如下:
编译器从头文件中读取到了函数声明,因此不必猜测函数返回什么类型,函数的顺序也就无关紧要了。
为了确保一切正常,你可以运行生成的程序,看它能否像刚才一样工作。
变身编译器
下面这个程序的一部分丢失了,你的工作是扮演编译器,在右侧的候选代码块分别填入空白处后,你会做什么?
变身编译器解答
下面这个程序的一部分丢失了,你的工作是扮演编译器,在右侧的候选代码块分别填入空白处后,你会做什么?
1 只有使用 gcc 编译器的-std=c99 选项编译后才会有该警告。——译者注这里没有蠢问题问:也就是说 int 函数可以没有声明?答:不一定,除非你想共享代码,马上你就会看到。问:我有点纳闷,你提到了编译器预处理,为什么编译器需要预处理?答:严格意义上讲,编译器只完成编译的步骤,即把 C 源代码转化为汇编语言。但宽泛地讲,编译是将 C 源代码转化为可执行文件的整个过程,这个过程由很多阶段组成,而 gcc 允许你控制这些阶段。gcc 会预处理和编译代码。问:什么是预处理?答:预处理是把 C 源代码转化为可执行文件的第一个阶段。预处理会在正式编译开始之前修改代码,创建一个新的源文件。拿你的代码来说,预处理会读取头文件中的内容,插入主文件。问:预处理器会真的创建一个文件吗?答:不会,为了提高编译的效率,编译器通常会用管道在两个阶段之间发送数据。问:为什么有的头文件用引号括起来,有的用尖括号?答:严格来说,这是由编译器的工作方式决定的。通常情况下,引号表示以相对路径查找头文件,如果不加目录名,只包含一个文件名,编译器就会在当前目录下查找头文件;如果用了尖括号,编译器就会以绝对路径查找头文件。问:编译器在寻找头文件时会查找哪些目录?答:gcc 知道标准库的头文件被保存在哪里,在类 Unix 操作系统中,头文件通常保存在/usr/local/include、/usr/include 这些地方。问:gcc 就是这样找到 stdio.h 的,是吗?答:是的,在类 Unix 操作系统中,stdio.h 位于/usr/include/stdio.h;如果在 Windows 中安装了 MinGW 编译器,stdio.h 就很有可能在 C:\MinGW\include\stdio.h 中。问:我可以创建我自己的库吗?答:可以,你会在后面几章中学到。
要点
如果编译器发现你调用了一个它没见过的函数,就会假设这个函数返回
int 。
所以如果想在定义函数前就调用它,就可能出问题。
函数声明在定义函数前就告诉编译器函数长什么样子。
如果在源代码顶端声明了函数,编译器就知道函数返回什么类型。
函数声明通常放在头文件中。
可以用#include 让编译器从头文件中读取内容。
编译器会把包含进来的代码看成源文件的一部分。
先生,这个位子有人订了……
C 语言是一种很小的语言,所有的保留字都在这里(排名不分先后)。所有的 C 程序都可以分解为这些关键字和若干符号。如果用这些关键字来命名,编译器会坐立不安。
auto
if
break
int
case
long
char
register
continue
return
default
short
do
sizeof
double
static
else
struct
entry
switch
extern
typedef
float
union
for
unsigned
goto
while
enum
void
const
signed
volatile
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论