黑马程序员技术交流社区

标题: 关于预处理命令3文件包含的问题 [打印本页]

作者: gxppq    时间: 2014-12-23 20:38
标题: 关于预处理命令3文件包含的问题
在预处理命令中的文件包含中,我们为了防止重复编译会用下面宏命令和条件编译的结合:
  1. #ifndef include____Header_h
  2. #define include____Header_h

  3. #endif
复制代码

我想问一下,____Header_h是什么意思?特别是有“___”,它有特别的含义吗?如果写成#ifndef include “one.h”我能懂,写成上面的形式我不太明白。麻烦各位朋友给讲解一下。谢谢~
作者: 从今以后    时间: 2014-12-23 20:59
没有强制要求 就是宏名 但是为了规范点一般是 文件名大写加_ 例如:
#ifndef _ONE_H_
#define _ONE_H_
/* 我是内容 */
#endif

作者: gxppq    时间: 2014-12-23 22:09
从今以后 发表于 2014-12-23 20:59
没有强制要求 就是宏名 但是为了规范点一般是 文件名大写加_ 例如:
#ifndef _ONE_H_
#define _ONE_H_

你的意思是写成#ifndef include “one.h”与写成#ifndef _ONE_H_是一样的?"_"没有特别的含义吗?大小写一样,"."和"_"也不对应,程序能识别吗?还有就是如果#ifndef include “one.h”这么写是可以的,为什么还要写成#ifndef _ONE_H_?
问题有点多,多谢了~
作者: 从今以后    时间: 2014-12-23 22:59
gxppq 发表于 2014-12-23 22:09
你的意思是写成#ifndef include “one.h”与写成#ifndef _ONE_H_是一样的?"_"没有特别的含义吗?大小写 ...

这个是防止重复包含的,第一次包含过去因为没有定义宏xxx,所以就定义一个,然后编译下面的代码;
第二次如果不小心又包含过去,因为定义过宏xxx,条件不成立了,后面代码就不编译了。
_ONE_H_就是个宏定义的宏名,宏名一般都是大写,_什么的都是为了规范化才写成这样的。
作者: chasedream    时间: 2014-12-23 23:08
gxppq 发表于 2014-12-23 22:09
你的意思是写成#ifndef include “one.h”与写成#ifndef _ONE_H_是一样的?"_"没有特别的含义吗?大小写 ...

条件编译,就是为了检验.h文件是否重复编译,你所说的#ifndef include "one.h"麻烦且不规范(语法对吗?),直接以文件名命名一个宏名,因为文件名是独一无二的,所以通过条件编译文件名命名的宏,来检验.h文件是否编译了一次。当然你也可以不用文件名命名为宏名,你也可以用合法的标志符也可以,只不过不规范而已。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2