高质量c/c++编程学习之一:文件结构

来源:互联网 发布:论文检测软件下载 编辑:程序博客网 时间:2024/06/06 19:36

高质量c/c++编程学习之一:文件结构 


注:本文参考《高质量c/c++编程》



1.1 版权和版本的声明 

版权和版本的声明位于头文件和定义文件的开头(参见示例 1-1),主要内容有: 

(1)版权信息。 

(2)文件名称,标识符,摘要。 

(3)当前版本号,作者/修改者,完成日期。 

(4)版本历史信息

/* * Copyright (c) 2001,上海贝尔有限公司网络应用事业部* All rights reserved.*  * 文件名称: filename.h* 文件标识: 见配置管理计划书 * 摘    要: 简要描述本文件的内容 *  * 当前版本: 1.1* 作    者: 输入作者(或修改者)名字 * 完成日期: 2001年7月20日 * * 取代版本:1.0  * 原作者  : 输入原作者(或修改者)名字* 完成日期: 2001年5月10日*/

1.2 头文件的结构 

【方法 1】为了防止头文件被重复引用,应当用 ifndef/define/endif 结构产生预处理块。 

假设头文件名称为 graphics.h,头文件的结构参见示例如下:

// 版权和版本声明见示例 1-1,此处省略#ifndef GRAPHICS_H // 防止 graphics.h 被重复引用#define GRAPHICS_H #include <math.h>  // 引用标准库的头文件 … #include “myheader.h”  // 引用非标准库的头文件 … void Function1(…); // 全局函数声明 … class Box      // 类结构声明 { … }; #endif 



【方法 2】#pragma once是一个比较常用的C/C++杂注,只要在头文件的最开始加入这条杂注,就能够保证头文件只被编译一次。

#pragma once... ... // 一些声明语句

       区别:

#pragma once是编译器相关的,有的编译器支持,有的编译器不支持,具体情况请查看编译器API文档,不过现在大部分编译器都有这个杂注了。
#ifndef,#define,#endif是C/C++语言中的宏定义,通过宏定义避免文件多次编译。所以在所有支持C++语言的编译器上都是有效的,如果写的程序要跨平台,最好使用这种方式。

比较:

#ifndef的方式依赖于宏名字不能冲突,这不光可以保证同一个文件不会被包含多次,也能保证内容完全相同的两个文件不会被不小心同时包含。当然,缺点就是如果不同头文件的宏名不小心“撞车”,可能就会导致头文件明明存在,编译器却硬说找不到声明的状况。
#pragma once则由编译器提供保证:同一个文件不会被编译多次。注意这里所说的“同一个文件”是指物理上的一个文件,而不是指内容相同的两个文件。带来的好处是,你不必再费劲想个宏名了,当然也就不会出现宏名碰撞引发的奇怪问题。对应的缺点就是如果某个头文件有多份拷贝,本方法不能保证他们不被重复包含。当然,相比宏名碰撞引发的“找不到声明”的问题,重复包含更容易被发现并修正。
方式一由语言支持所以移植性好,方式二 可以避免名字冲突
#pragma once方式产生于#ifndef之后,因此很多人可能甚至没有听说过。目前看来#ifndef更受到推崇。因为#ifndef受语言天生的支持,不受编译器的任何限制;而#pragma once方式却不受一些较老版本的编译器支持,换言之,它的兼容性不够好。也许,再过几年等旧的编译器死绝了,这就不是什么问题了。

1.3  目录结构 

如果一个软件的头文件数目比较多(如超过十个),通常应将头文件和定义文件分别 保存于不同的目录,以便于维护。 


例如可将头文件保存于 include 目录,将定义文件保存于 source 目录(可以是多级 目录) 。 


如果某些头文件是私有的,它不会被用户的程序直接引用,则没有必要公开其“声 明”。为了加强信息隐藏,这些私有的头文件可以和定义文件存放于同一个目录。 

原创粉丝点击