C语言学习趣事_关于C语言中的预处理
2011-06-04 11:02
260 查看
以前在学校的时候, 老师教我们在编写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...语句最大的不同,其他的都一样。
来看看我的实验代码:
第一个是主程序的源文件名: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...语句最大的不同,其他的都一样。
相关文章推荐
- C语言学习趣事_关于C语言中的输入输出流
- 【C语言学习趣事】_33_关于C语言和C++语言中的取余数(求模)的计算_有符号和无符号数的相互转换问题
- C语言学习趣事_20_关于数组名与指针的讨论
- C语言学习趣事_关于C语言中复杂类型定义
- C语言学习趣事_18_关于结构体_求讨论
- C语言学习趣事_关于指针转换
- C语言学习趣事_关于C语言中的空格
- C语言学习趣事_关于指针转换
- C语言学习趣事_关于C语言中的输入输出流_续一
- 在之前开了一个csdn博客,是关于C语言的,如今开始学习java与android开发,就把从现在开始我的每一天学习都展示在这里吧
- C语言学习趣事_之_大数运算_加法
- c++学习之--关于编译预处理
- 【C语言学习趣事】_30_《C程序设计语言》_Secnod_Edition_习题
- 【IOS 开发学习总结-OC-7.4】objective-c与c语言的预处理
- C语言学习趣事_经典面试题系列_3
- 嵌入式学习11(C语言预处理与宏)
- C语言预处理功能 关于字符串化和符号粘贴
- 关于C语言中的预处理指令
- 预处理03 - 零基础入门学习C语言52
- C语言学习--关于指针