`
Conviction
  • 浏览: 5898 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

头文件、预处理器、命名空间

 
阅读更多

1.头文件用于声明而不是用于定义

extern int ival = 10;	//初始化了,为定义,不适合放在头文件中
double dval;            //没有extern,是定义,不适合放在头文件中

 注意:避免防止多重定义链接错误。因为头文件包含在多个源文件中,所以不应该含有变量或函数的定义。

关于头文件不应该含有定义这一规则,有三个例外

头文件可以定义类、值在编译时就已知道的const对象和inline函数。这些实体可在多个源文件中定义,只要每个源文件中的定义是相同的。

 

2.预处理器

(1)头文件经常#include其他的头文件。比如某些类的头文件必须包含string库

(2)避免多重包含,在编写头文件之前,需要引入一些额外的预处理器设施。预处理器允许我们自定义变量。预处理器变量的名字在程序中必须是唯一的。任何与预处理器变量相匹配的名字的使用都关联到该预处理器变量。

为避免名字冲突,预处理器变量经常用全大写字母表示。

预处理器变量有两种状态:已定义,未定义。

#define指示:接受一个名字并定义该名字为预处理器变量。

#ifndef指示:检测指定的预处理器变量是否未定义。如果预处理器变量未定义,那么跟在其后的所有指示都被处理,直到出现#endif

#ifndef F1_H
#define F1_H

#endif

 注意:头文件应该含有保护符,即使这些头文件不会被其他头文件包含。编写头文件保护符并不困难,而且如果头文件被包含多次,它可以避免难以理解的编译错误。

 

3.使用自定义的头文件

#include指示接受两种形式:

#include<>:   标准头文件

#include" ":    非系统头文件,非系统头文件的查找通常开始于源文件所在的路径。

 

4.using声明

格式:using namespace::name;

一旦使用了using声明,我们就可以直接引用名字,而不需要再引用该名字的命名空间。

5.使用标准库类型的类定义

如果在头文件中放置using声明,就相当于在包含该头文件的每个程序中都放置了同一using声明,不论程序是否需要using声明。

注意:通常头文件中应该只定义确实必要的东西。

分享到:
评论

相关推荐

    万能头文件在C语言中的重要性及其主要格式.docx

    命名空间冲突:不同的头文件可能定义了相同的宏或其他全局标识符,造成命名冲突。 依赖混乱:隐藏了代码的真实依赖关系,不利于维护和理解代码。 不符合规范:C语言标准并没有提供官方的“万能头文件”,因此这样...

    《C++ Primer Plus 第六版 中文版》的研读与学习(四)

    今天,我们继续来学习《C++ Primer Plus 第六版 中文版》,上次我们讲到C++的头文件和命名空间,今天我们下来看看C++中显示消息(输出)的语句。 先贴上样例代码: #include // a PREPROCESSOR directive 一个预...

    非常经典的c++ primer视频教程6-10

    3.1 命名空间的using声明 3.2 标准库string类型 3.2.1 string对象的定义和初始化 3.2.2 String对象的读写 3.2.3 string对象的操作 3.2.4 string对象中字符的处理 3.3 标准库vector类型 3.3.1 vector对象的...

    C++高级参考手册 完全自学 内容详细 讲解通俗易懂

    8.1 预处理器的缺陷 8.2 内联函数 8.2.1 类内部的内联函数 8.2.2 存取函数 8.3 内联函数和编译器 8.3.1 局限性 8.3.2 赋值顺序 8.3.3 在构造函数和析构函数里隐藏行为 8.4 减少混乱 8.5 预处理器的特点 ...

    nl80211rs:netlink 802.11 接口公共头的 Rust 版本

    原因是前缀是多余的给定 crate 和模块命名空间。 crate::enum::CamelCaseUid 例如。 nl80211_commands::NL80211_CMD_START_AP 成为 nl80211rs::Commands::StartAp 常量保存在它们自己的模块nl80211rs::...

    C++编程思想 例子和叙述讲解C++编程

    8.1 预处理器的缺陷 142 8.2 内联函数 144 8.2.1 类内部的内联函数 145 8.2.2 存取函数 146 8.3 内联函数和编译器 150 8.3.1 局限性 150 8.3.2 赋值顺序 150 8.3.3 在构造函数和析构函数里隐藏行为 151 8.4 减少混乱...

    C++编程思想.pdf

    8.1 预处理器的缺陷 142 8.2 内联函数 144 8.2.1 类内部的内联函数 145 8.2.2 存取函数 146 8.3 内联函数和编译器 150 8.3.1 局限性 150 8.3.2 赋值顺序 150 8.3.3 在构造函数和析构函数里隐藏行为 151 8.4 减少混乱...

    C++编程思想

    8.1 预处理器的缺陷 142 8.2 内联函数 144 8.2.1 类内部的内联函数 145 8.2.2 存取函数 146 8.3 内联函数和编译器 150 8.3.1 局限性 150 8.3.2 赋值顺序 150 8.3.3 在构造函数和析构函数里隐藏行为 151 8.4 减少混乱...

    C++编程思想 PDF

    8.5 预处理器的特点 153 8.6 改进的错误检查 154 8.7 小结 155 8.8 练习 155 第9章 命名控制 157 9.1 来自C语言中的静态成员 157 9.1.1 函数内部的静态变量 157 9.1.2 控制连接 160 9.1.3 其他的存储类型...

    C++编程思想.rar

    8.1 预处理器的缺陷 142 8.2 内联函数 144 8.2.1 类内部的内联函数 145 8.2.2 存取函数 146 8.3 内联函数和编译器 150 8.3.1 局限性 150 8.3.2 赋值顺序 150 8.3.3 在构造函数和析构函数里隐藏行为 151 8.4 减少混乱...

    c++ 编程思想 (高清pdf)

    8.1 预处理器的缺陷 142 8.2 内联函数 144 8.2.1 类内部的内联函数 145 8.2.2 存取函数 146 8.3 内联函数和编译器 150 8.3.1 局限性 150 8.3.2 赋值顺序 150 8.3.3 在构造函数和析构函数里隐藏行为 151 8.4 减少混乱...

    C++编程思想(程序员必读)

    8.1 预处理器的缺陷 142 8.2 内联函数 144 8.2.1 类内部的内联函数 145 8.2.2 存取函数 146 8.3 内联函数和编译器 150 8.3.1 局限性 150 8.3.2 赋值顺序 150 8.3.3 在构造函数和析构函数里隐藏行为 151 8.4 减少混乱...

    C++编程思想PDF版

    8.5 预处理器的特点 153 8.6 改进的错误检查 154 8.7 小结 155 8.8 练习 155 第9章 命名控制 157 9.1 来自C语言中的静态成员 157 9.1.1 函数内部的静态变量 157 9.1.2 控制连接 160 9.1.3 ...

    C++高级参考手册(供高级程序员参考)

    8.1 预处理器的缺陷 142 8.2 内联函数 144 8.2.1 类内部的内联函数 145 8.2.2 存取函数 146 8.3 内联函数和编译器 150 8.3.1 局限性 150 8.3.2 赋值顺序 150 8.3.3 在构造函数和析构函数里隐藏行为 151 8.4 减少混乱...

    C++编程思想,很经典

    8.1 预处理器的缺陷 142 8.2 内联函数 144 8.2.1 类内部的内联函数 145 8.2.2 存取函数 146 8.3 内联函数和编译器 150 8.3.1 局限性 150 8.3.2 赋值顺序 150 8.3.3 在构造函数和析构函数里隐藏行为 151 8.4 减少混乱...

Global site tag (gtag.js) - Google Analytics