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

推荐订阅源

C
CXSECURITY Database RSS Feed - CXSecurity.com
Stack Overflow Blog
Stack Overflow Blog
月光博客
月光博客
T
Threat Research - Cisco Blogs
小众软件
小众软件
有赞技术团队
有赞技术团队
酷 壳 – CoolShell
酷 壳 – CoolShell
Apple Machine Learning Research
Apple Machine Learning Research
C
Cyber Attacks, Cyber Crime and Cyber Security
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
T
Tailwind CSS Blog
Cisco Talos Blog
Cisco Talos Blog
V
V2EX
博客园 - 【当耐特】
C
Cybersecurity and Infrastructure Security Agency CISA
Hugging Face - Blog
Hugging Face - Blog
The Cloudflare Blog
The Last Watchdog
The Last Watchdog
Simon Willison's Weblog
Simon Willison's Weblog
T
Threatpost
S
Secure Thoughts
O
OpenAI News
P
Proofpoint News Feed
S
SegmentFault 最新的问题
Forbes - Security
Forbes - Security
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Application and Cybersecurity Blog
Application and Cybersecurity Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Last Week in AI
Last Week in AI
宝玉的分享
宝玉的分享
Scott Helme
Scott Helme
T
Tenable Blog
A
Arctic Wolf
L
LINUX DO - 热门话题
爱范儿
爱范儿
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
www.infosecurity-magazine.com
www.infosecurity-magazine.com
V
Visual Studio Blog
Hacker News: Ask HN
Hacker News: Ask HN
Hacker News - Newest:
Hacker News - Newest: "LLM"
腾讯CDC
博客园 - Franky
WordPress大学
WordPress大学
Know Your Adversary
Know Your Adversary
博客园_首页
雷峰网
雷峰网
IT之家
IT之家
PCI Perspectives
PCI Perspectives
L
LINUX DO - 最新话题
H
Heimdal Security Blog

博客园 - 情走边锋

(摘)设置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( ) 函数可
以出现在同一个文件中。应当记住,在实际上使用的是隔离的文件和头文件。