以前在学校的时候, 老师教我们在编写C语言的时候不要忘记包含头文件,这里指的是扩展名是.h的文件,以前一直不明白这个机制,总以为这个是不能自定义的,只能包含库头文件。但是今天有点头脑发热,想自己试试自己的猜想是不是正确的,于是早上起来自己写了几句小代码想验证一下自己的想法是否是对的。
来看看我的实验代码:
第一个是主程序的源文件名:main.c,存放在任意的系统中的任意一个目录中, 由于是在WinXP上实验,同时采用的编译环境是WinTC, 所以要保证编译路径的每一级目录名(文件夹名)的长度不长于8个字符, 同时要保证路径中不能包含Unicode字符编码(这个我不肯定,因为对日文、韩文等没有测试,仅在中文环境测试时这样的),即目录名不能有汉字。
Exp1:
/***************************
include 包含指令的学习测试代码
***************************/
#include <stdio.h>
#inlcude "C:\define.h"
int main(int argc, char *argv[] )
{
printf("%ld",UINTMAX);
printf("\nThe size of int in this system is:%d",INTLEN);
getch();
return 0 ; //通常这个地方对环境脚本影响应该会比较大,但是对自己本身的程序,好像影响不大,估计是编译器对这个要求不严,要不就是编译器会自动 //加上这个语句吧,
}
然后下面是我的define.h 文件, 存放在C盘根目录下:
#define SIZE sizeof(int)
#if 4==SIZE
#define UINTMAX 4294967295
#define INTLEN 4
#else
#define UINTMAX 65535
#define INTLEN 2
#endif
程序经过编译和运行得到的结果如下所示:(本来要贴图的,但是我不会贴图)
65535
The size of the int in this systemis: 2
运行居然能成功,与我猜想的一样, include 指令可以包含程序员自己定义的头文件,而不单单是只能包含编译环境所带的头文件。
由此我猜想: 如果我把我用的define.h 文件成.c 文件是否可以成功,结果也成功,并且运行结果与前面的一样; 进而我就进一步猜想,我把文件名改成.txt来试验一下,结果同样成功。
通过上面的试验我得出一个结论: include 指令包含的文件与文件的扩展名没有多大关系,只要文件内容按照C语言的规范进行描述,同时保存文件的内容编码是按照文本文件编码就可以。
下面来讨论一下预处理的机制:
1、 include 指令
首先说明一句 include 不是C语句。 但是include 在C源程序代码中使用了,那为什么又不是C语句呢? 其实很简单, 在C规范里面,C语句明确的定义为以分号 ';' 结束的是C语句。
通过我上面的试验加上一些文档的介绍我个人认为: include 给程序员提供了一种搜索文件的功能,这个搜索过程是在程序员制定的路径下进行,当程序员指定的文件存在就把文件的内容,一致的复制一个副本到源程序的代码中,并进行编译。
2、 include <> 和 include " "的区别
<>表示搜索路径是在编译环境设置的环境变量里面搜索
" "则表示在环境变量设置的路径里面搜索,如果搜索不到则到用户制定的目录下搜索
3、针对上面的代码再说一下
#if
#else
#endif
这 个预处理指令的使用与if...else...语句的使用是一样的,只是格式有点不一样, 同时这个语句也可以在main函数中使用, 我上学的时候不知道(我学的是自动化,非计算机专业,老师没有教,用的是自己老师编写的教材, 推荐的参考书是谭浩强的第二版的那本书,里面都没有示例这样用的)
而且我们发现:
#if
#else
#endif 的判断条件不需要用() 括起来, 我实验过,如果括起来也是可以的,这是与if...else...语句最大的不同,其他的都一样。