C++标准库头文件正确用法
目录
- 基本包含规则
- 命名空间的处理
- C头文件 vs C++头文件
- 简化命名空间使用
- 实际编程建议
C++程序员都知道,写代码前总要先包含各种头文件。但很多人对头文件的使用规则并不完全了解,有时候程序能跑,有时候又莫名其妙地报错。这篇文章就来说说C++标准库头文件的正确用法。
基本包含规则
包含标准头文件最直接的方式就是用#include
指令:
#include <IOStream> // 包含I/O相关功能 #include <vector> // 包含vector容器 #include <string> // 包含字符串类
这些标准头文件有几个特点:可以按任意顺序包含,可以重复包含(不会出错),两个或多个头文件定义相同的宏或类型也没问题。但有两点需要注意:不要在声明中间包含头文件,包含头文件前不要定义与关键字同名的宏。
C++库头文件会自动包含它需要的其他头文件。比如你包含了<vector>
,它可能会自动包含一些内部需要的头文件。不过最好还是显式包含你用到的所有头文件,这样代码更清晰,也避免依赖关系改变导致的问题。
C++头文件依赖可视化工具:https://github.com/goldsboroujavascriptgh/ig
命名空间的处理
C++标准库的所有名字都定义在std
命名空间中,除了operator delcPPXeMhkete
和operator new
。所以你需要写std::cin
而不是直接写cin
:
#include <iostream> int main() { std::cout << "Hello World" << std::endl; return 0; }
宏名称不受命名空间限制,所以像__ST编程D_COMPLEX
这样的宏直接使用即可。
C头文件 vs C++头文件
这里容易搞混的是C标准头文件的处理。C++标准要求C标准头文件把所有外部名称先声明在std
命名空间中,然后再用using
声明提升到全局命名空间。但实际情况因编译环境而异。
想要最大的可移植性,记住两个规则:
如果你想确保某个传统上在<stdlib.h>
中声明的外部名称在std
命名空间中,就包含<cstdlib>
:
#include <cstdlib> int main() { std::abort(); // 确保在std命名空间中 return 0; }
如果你想确保在全局命名空间中,就直接包含<stdlib.h>
:
#include <stdlib.h> int main() { abocPPXeMhkrt(); // 直接使用,无需std::前缀 return 0; }
C++参考文档:https://cppreference.com
简化命名空间使用
如果觉得每次都写std::
太麻烦,可以用using namespace std;
:
#include <iostream> #include <vector> using namespace std; int main() { cout << "现在可以直接使用cout了" << endl; vector<int> nums = {1, 2, 3, 4, 5}; return 0; }
这样做会把所有库名称引入当前命名空间。如果在所有include指令后立即写这个声明,名称就被提升到全局命名空间,后续代码就可以忽略命名空间问题了。
实际编程建议
在实际编程中,头文件的选择很重要。如果你的项目比较小,用using namespace std;
没什么问题javascript。但在大型项目中,最好避免污染全局命名空间,明确指定std::
前缀或者只引入需要的特定名称:
#include <iostream> #include <string> using std::cout; using std::endl; using std::string; int main() { string message = "这样更清晰"; cout << message << endl; return 0; }
记住一点:除非特别说明,不要在std
命名空间或其嵌套命名空间中定义自己的名称。这可能导致未定义行为。
Microsoft C++文档:https://docs.microsoft.com/cpp
到此这篇关于C++标准库头文件使用指南的文章就介绍到这了,更多相关C++标准库头文件使用内容请搜索编程客栈(www.devze.com)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程客栈(www.devze.com)!
精彩评论