您的位置:首页
一点收获
2017-01-01 15:58
120 查看
1、关于#ifndef #define #endif (http://blog.csdn.net/abc5382334/article/details/18052757)感谢这位。
想必很多人都看过“头文件中的 #ifndef/#define/#endif 防止该头文件被重复引用”。但是是否能理解“被重复引用”是什么意思?
是不能在不同的两个文件中使用include来包含这个头文件吗?如果头文件被重复引用了,会产生什么后果?
是不是所有的头文件中都要加入#ifndef/#define/#endif 这些代码?
其实“被重复引用”是指一个头文件在同一个cpp文件中被include了多次,这种错误常常是由于include嵌套造成的。比如:存在a.h文件#include "c.h"而此时b.cpp文件导入了#include "a.h" 和#include "c.h"此时就会造成[b]c.h重复引用。[/b]
头文件被重复引用引起的后果:
有些头文件重复[b]引用只是增加了编译工作的工作量,不会引起太大的问题,仅仅是编译效率低一些,但是对于大工程而言编译效率低下那将是一件多么痛苦的事情。
有些头文件重复包含,会引起错误,比如在头文件中定义了全局变量(虽然这种方式不被推荐,但确实是C规范允许的)这种会引起重复定义。[/b]
下面给一个#ifndef/#define/#endif的格式:
#ifndef A_H意思是"if not define a.h" 如果不存在a.h
接着的语句应该#define A_H 就引入a.h
最后一句应该写#endif 否则不需要引入。
一般用在.h文件中,里面都是宏定义。
注意定义的时候需要大写,点号用下划线代替。
2、关于份文件编写时的‘.h’和‘.c’文件
这样做目的是为了实现软件的模块化
使软件结构清晰,而且也便于别人使用你写的程序
纯粹用 C 语言语法的角度,你当然可以在 .h 中放任何东西,因为 #include 完全等价 于把 .h 文件 Ctrl-C Ctrl-V 到 .c 中
.h 中应该都是一些宏定义和变量、函数声明,告诉别人你的程序“能干什么、该怎么用”
.c 中是所有变量和函数的定义,告诉计算机你的程序“该怎么实现”
想必很多人都看过“头文件中的 #ifndef/#define/#endif 防止该头文件被重复引用”。但是是否能理解“被重复引用”是什么意思?
是不能在不同的两个文件中使用include来包含这个头文件吗?如果头文件被重复引用了,会产生什么后果?
是不是所有的头文件中都要加入#ifndef/#define/#endif 这些代码?
其实“被重复引用”是指一个头文件在同一个cpp文件中被include了多次,这种错误常常是由于include嵌套造成的。比如:存在a.h文件#include "c.h"而此时b.cpp文件导入了#include "a.h" 和#include "c.h"此时就会造成[b]c.h重复引用。[/b]
头文件被重复引用引起的后果:
有些头文件重复[b]引用只是增加了编译工作的工作量,不会引起太大的问题,仅仅是编译效率低一些,但是对于大工程而言编译效率低下那将是一件多么痛苦的事情。
有些头文件重复包含,会引起错误,比如在头文件中定义了全局变量(虽然这种方式不被推荐,但确实是C规范允许的)这种会引起重复定义。[/b]
下面给一个#ifndef/#define/#endif的格式:
#ifndef A_H意思是"if not define a.h" 如果不存在a.h
接着的语句应该#define A_H 就引入a.h
最后一句应该写#endif 否则不需要引入。
一般用在.h文件中,里面都是宏定义。
注意定义的时候需要大写,点号用下划线代替。
2、关于份文件编写时的‘.h’和‘.c’文件
这样做目的是为了实现软件的模块化
使软件结构清晰,而且也便于别人使用你写的程序
纯粹用 C 语言语法的角度,你当然可以在 .h 中放任何东西,因为 #include 完全等价 于把 .h 文件 Ctrl-C Ctrl-V 到 .c 中
.h 中应该都是一些宏定义和变量、函数声明,告诉别人你的程序“能干什么、该怎么用”
.c 中是所有变量和函数的定义,告诉计算机你的程序“该怎么实现”
相关文章推荐
- 11个审查Linux是否被入侵的方法
- (23)窗口视区变换
- python 读写文件
- SQL的四种连接-左外连接、右外连接、内连接、全连接
- MySQL 中间件 Mycat 安装与使用 - 读写分离
- 目录:WebService
- 如何让自己写的app可以保存数据
- oracle单机改变归档路径
- linux vi(vim)常用命令汇总
- JAVA_weB中的一些配置
- C++对象指针
- 凯利公式测试
- 2.Hibernate之联合主键
- 修复win7下安装centos7双系统后,没有win7启动项
- MySQL 中间件汇总比较
- Spring 通过Autowired 和 Context.getBean()方式拿到的不是同一个Bean
- 1006. Sign In and Sign Out
- 关于安全学习的一些思考
- 【android学习】onSaveInstanceState使用详解-之解决问题:android程序崩溃后,app异常
- 计算几何总结