惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

L
LINUX DO - 热门话题
Stack Overflow Blog
Stack Overflow Blog
B
Blog
WordPress大学
WordPress大学
Project Zero
Project Zero
P
Palo Alto Networks Blog
阮一峰的网络日志
阮一峰的网络日志
博客园 - 司徒正美
有赞技术团队
有赞技术团队
S
SegmentFault 最新的问题
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
小众软件
小众软件
T
Tailwind CSS Blog
Forbes - Security
Forbes - Security
F
Full Disclosure
SecWiki News
SecWiki News
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Hacker News: Ask HN
Hacker News: Ask HN
C
Check Point Blog
Microsoft Security Blog
Microsoft Security Blog
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
F
Fortinet All Blogs
Cisco Talos Blog
Cisco Talos Blog
G
Google Developers Blog
J
Java Code Geeks
Google DeepMind News
Google DeepMind News
人人都是产品经理
人人都是产品经理
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Recorded Future
Recorded Future
O
OpenAI News
Spread Privacy
Spread Privacy
MongoDB | Blog
MongoDB | Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
C
Cybersecurity and Infrastructure Security Agency CISA
S
Securelist
V
Vulnerabilities – Threatpost
Y
Y Combinator Blog
IT之家
IT之家
U
Unit 42
腾讯CDC
S
Security Affairs
C
Cisco Blogs
Schneier on Security
Schneier on Security
The Last Watchdog
The Last Watchdog
B
Blog RSS Feed
宝玉的分享
宝玉的分享
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
S
Security @ Cisco Blogs
Cyberwarzone
Cyberwarzone
T
The Blog of Author Tim Ferriss

博客园 - 情走边锋

(摘)设置FCKeditor回车换行方式 JBossESB问题记录 jstl fmt功能说明 oracle中number类型说明 解决通过createElement创建出来的radio无法选中的问题 asp.net C# 中使用timestamp 编码 GBK 的不可映射字符 解决办法 asp.net中SQL注入的解决办法 - 情走边锋 - 博客园 SQL2005部署报表:用户IUSER_ 授予的权限不足的问题 发现一个网页幻灯制作的东西HTML Slidy AS无法连接,由于目标机积极拒绝,无法连接。127.0.0.1:2382(system) Android中ActivityManager: Error: Activity class {XXX} does not exist的问题 windows上安装postgresql OpenBSD4.0下安装samba 序列化与反序列化 IE6无法正常显示VML Linux下Makefile的automake生成全攻略 随记 开始Bro之旅
C++中的头文件
情走边锋 · 2007-04-17 · via 博客园 - 情走边锋

Posted on 2007-04-17 09:35  情走边锋  阅读(2241)  评论()    收藏  举报

      当我第一次学习用 C 编程时,头文件对我是神秘的。许多有关 C语言的书似乎不强调它,
并且编译器也并不强调函数声明,所以它在大部分时间内似乎是可要可不要的,除非要声明结
构时。在 C++ 中,头文件的使用变得非常清楚。它们对于每个程序开发是强制的,在它们中
放入非常特殊的信息:声明。头文件告诉编译器在我们的库中哪些是可用的。因为对于 C P P
文件能够不要源代码而使用库(只需要对象文件或库文件),所以头文件是存放接口规范的唯
一地方。
        头文件是库的开发者与它的用户之间的合同。它说:“这里描述的是库能做什么。”它不说
如何做,因为如何做存放在C P P文件中,开发者不需要分发这些描述“如何做”的源代码给用
户。
       该合同描述数据结构,并说明函数调用的参数和返回值。用户需要这些信息来开发应用程
序,编译器需要它们来产生相应的代码。
         编译器强迫执行这一合同,也就是要求所有的结构和函数在它们使用之前被声明,当它们
是成员函数时,在它们被定义之前被声明。这样,就强制把声明放在头文件中并把这个头文件
包含在定义成员函数的文件和使用它们的文件中。因为描述库的单个头文件被包括在整个系统
中,所以编译器能保证一致和避免错误。
为了恰当地组织代码和写有效的头文件,有一些问题必须知道。第一个问题是将什么放进
头文件中。基本规则是“只声明”,也就是说,对于编译器只需要一些信息以产生代码或创建
变量分配内存。这是因为,在一个项目中,头文件也许会包含在几个处理单元中,而如果内存
分配不止一个地方,则连接器会产生多重定义错误。
        这个规则不是非常严格的。如果在头文件中定义“静态文件”的一段数据(只在文件内可
视),在这个项目中将有这个数据的多个实例,编译器不会报错。基本上,不要在头文件中做
在连接时会引起混淆的任何事情。
       关于头文件的第二个问题是重复声明。 C 和 C++ 都允许对函数重复声明,只要这些重复
声明匹配,但决不允许对结构重复声明。在 C++ 中,这个规则特别重要,因为,如果编译器
允许对结构重复声明而且这两个重复声明又不一样,那么应当使用哪一个呢?
       重复声明问题在 C++ 中很少出现,因为每个数据类型(带有函数的结构)一般有自己的
头文件。但我们如果希望创建使用某个数据类型的另一个数据类型,必须在另一个头文件中包
含它的头文件。在整个项目中,很可能有几个文件包含同一个头文件。在编译期间,编译器会
几次看到同一个头文件。除非做适当的处理,否则编译器将认为是结构重复声明。
典型的防止方法是使用预处理器隔离这个头文件。如果有一个头文件名为 F O O . H,一般
用“名字分解”产生预处理名,以防止多次包含这个头文件。FOO.H 的内部可以如下:
#ifndef FOO_H_
#define FOO_H_
// Rest of header here ...
#endif // FOO_H_
注意:不用前导下划线,因为标准 C 用前导下划线指明保留标识符。
在项目中使用头文件
用 C++ 建立项目时,我们通常要汇集大量不同的类型(带有相关函数的数据结构)。一般
将每个类型或一组相关类型放在一个单独的头文件中,然后在一个处理单元中定义这个类型的
函数。当使用这个类型时必须包含这个头文件,形成适当的声明。
有时这个模式会在本书中使用,但如果例子很小,结构声明、函数定义和 main( ) 函数可
以出现在同一个文件中。应当记住,在实际上使用的是隔离的文件和头文件。